2011-03-07 58 views
0

//如果代碼是地址值

char str[]="hello";  
char *sptr=&str[2]; 
cout<<sptr; 

//輸出不是一個十六進制值,但LLO
....爲什麼?
//還考慮下面的代碼

char array[]="hello world"; 
char array1[11]; 
int i=0; 
while(array[i]!='\0') 
{array1[i]=array[i]; 
i++;} 

//如果我們打印陣列1,打印出來的世界您好,但遇到了hello和world之間的空間時,它應該已經停止。

+1

字符串是'\ 0'終止的,而不是'' - 終止(=空格終止),爲什麼它應該停在'hello'? – phimuemue 2011-03-07 16:33:37

回答

4

operator<<operator<<輸出流使用的重載過載爲const char*,因此您可以更自然地輸出字符串文本和C字符串。

如果你要打印的地址,你可以投指針const void*

std::cout << static_cast<const void*>(sptr); 

在你的第二個問題,\0是空終止字符:它是用來終止字符串。 array實際上包含"hello world\0",所以循環不會停止,直到到達字符串的末尾。 helloworld之間的字符是空格字符(推測是):' '

1
  1. 當您打印char*時,它會打印爲字符串。

  2. '\0'' '

0

關於你提到的第一個問題:

默認情況下,char被解釋爲文本表示槽調用std::cout

如果你想輸出你的性格的十六進制表示,使用下面的代碼:

std::cout << std::hex << static_cast<int>(c); 

哪裏c是你的性格。

在您的代碼:

cout<<sptr; 

特徵碼指針是一個指針char,而不是一個char所以std::cout其顯示爲C-字符串。

關於你提到的第二個問題:

的空間是ASCII字符32,而不是0。因此你的測試只檢查其副本結束空字符。

0

關於cout,將const char *(和char *)寫入到將打印內容而不是指針的流中存在特殊的重載。

對於array1,實際上沒有什麼不對,因爲它不會將空字節複製到它。當你嘗試打印時會出現問題,因爲它會嘗試打印,直到找到0字節,這意味着讀取數組的末尾。

由於現在的編譯器可能會填充幾個字節,因爲接下來的事情是一個int,因此它可能會對齊它。實際上,填充的一個字節實際上可以是任何東西,但不一定是零字符。

它可能會遇到的接下來的幾個字符將是int本身,並且根據字節順序,零字節將是第一個或第二個字節。

雖然它在技術上未定義的行爲。