2015-02-24 52 views
0
#include <iostream> 

#include <string.h> 

using namespace std; 

int main() 

{ 

    char x[100]="hello"; 

    int s=strlen(x); 

    cout<<&(x[0]); 

} 

如果我編譯並運行它,爲什麼字符串的行爲不同?

輸出爲你好

爲什麼不是輸出的性格特徵「H」的地址?

+1

嘗試'cout <<(void *)&(x [0]);' – vsoftco 2015-02-24 14:21:13

+2

已經回答很多次了 – texasbruce 2015-02-24 14:27:33

+1

「爲什麼輸出結果不是地址'h'?」 - 是的,你只需要適當地解釋它。 – 2015-02-24 14:32:38

回答

10

因爲operator <<過載,因此const char*打印由const char*指向的零終止的C字符串。

+0

如果你實際上試圖打印地址,並且char *實際上並不指向零終止的字符數組,則會導致令人感到興奮的結果。 – Cubic 2015-02-24 14:24:42

+1

@Cubic如果你想要的地址,一個簡單的cast''void *'很好用。 – 2015-02-24 14:25:46

1

指針不保存指向單個對象或數組的第一個對象的信息。還要考慮到表達式中的數組名轉換爲指向其第一個元素的指針。所以,如果你有例如const char *類型的指針這樣

const char *p = "Hello"; 

然後很自然的期望,這種說法

std::cout << p << std::endl; 

將輸出字符串文字「你好」。

如果要輸出字符串文字的第一個元素的地址,你必須使用另一個重載operator <<類型void *

std::cout << (const void *)p << std::endl; 

的指針,因此,有一個兩難如何處理char *類型的指針並且有利於將這些指針視爲指向字符串的第一個元素的指針,並因此輸出整個字符串。

+0

我可以問你爲什麼繼續回滾完全有效的編輯,改進你自己的答案的格式? – Shoe 2015-02-24 14:31:03

+0

@Jefffrey是的,你可能會問。:)我沒有回滾編輯。看起來我們正在同時編輯,當我保存編輯時,您的編輯已被丟棄。 – 2015-02-24 14:33:55

相關問題