3

所以......我有以下代码:

int main(void)
{
const char *s="hello, world";
cout<<&s[7]<<endl;

return 0;
}

它打印“世界”......但我不明白为什么会这样:

int main(void)
{
const char *s="hello, world";
cout<<s[7]<<endl;

return 0;
}

只会打印“w”(我所做的只是去掉了&符号),但我认为那是运算符的“地址”......这让我想知道你为什么需要它以及它的功能是什么?

4

3 回答 3

10

s[7]是字符'w',所以&s[7]成为字符的地址'w'。当您将类型的地址传递给 时,它会打印从字符开始到作为字符串结尾的空字符的所有字符,即它会继续打印字符,直到找到为止。这就是打印的方式。char*cout'w'\0world

就像这样,

const char *s="hello, world";
const char  *pchar = &s[7]; //initialize pchar with the address of `w`
cout<< pchar <<endl; //prints all chars till it finds `\0` 

输出:

world

但是,如果你想打印 的地址s[7],即 的值&s[7],那么你必须这样做:

cout << ((void*)&s[7]) << endl; //it prints the address of s[7]

现在我们传递了一个void*类型的地址,因此cout无法推断它过去使用char*类型地址推断的内容。隐藏有关地址内容void*的所有信息。所以简单地打印地址本身。毕竟,这是它最多得到的。cout

在线演示:http ://www.ideone.com/BMhFy

于 2011-05-25T04:42:18.903 回答
4

您的标题与您的问题不符......根本。

因为s是指向 char(又名 C 风格字符串)的指针,s[7]所以是 char。因为s[7]是一个字符,&s[7]所以是一个指向字符的指针(又名 C 风格的字符串)。

于 2011-05-25T04:42:43.503 回答
0

s[7] 是一个字符。(您可以索引指向数组的指针,就好像它只是数组的名称一样)。

&s[7] 是指向索引 7 处的字符的指针。它的类型是 char*,因此流插入器将其视为 char*。

于 2011-05-25T04:43:55.143 回答