2011-05-25 50 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 *。

相關問題