2011-05-25 48 views
3

所以...我有以下代码:如果x是一个指针,x和x的区别是什么?

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” (所有我改变的是摆脱&符号),但我认为这是“操作符的地址......这让我想知道为什么你需要它,它的功能是什么?

回答

10

s[7]是字符'w',所以&s[7]成为字符'w'地址。当你通过地址char*类型为cout时,它将从字符开始的所有字符打印到作为字符串结尾的空字符,即它继续打印从'w'开始的字符直到找到\0。这就是如何打印world

它这个样子,

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* typ e,所以cout将无法​​推断它用于推断char*类型的地址。 void*隐藏所有关于内容的信息。所以cout只需打印地址本身。毕竟,这是最多的。

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

4

您的标题不符合您的问题......在所有。

由于s是字符指针(又名C风格字符串),s[7]是炭。由于s[7]是char,因此&s[7]是指向char(又名C风格的字符串)的指针。

0

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

& s [7]是一个指向索引7字符的指针。它的类型是char *,所以流插入器将它视为char *。

相关问题