2009-02-01 36 views
13

我正在使用C++來理解指針如何工作。我有一段使用數組的代碼,我只是用它來理解等價物如何與指針一起工作。爲什麼cout打印字符數組與其他數組不同?

int main() {  
    int arr[10] = {1,2,3};  
    char arr2[10] = {'c','i','a','o','\0'}; 
    cout << arr << endl; 
    cout << arr2 << endl; 
} 

然而,當我運行此,arr輸出整數(如預期)的陣列的第一個元素的地址,但arr2不輸出字符的數組的第一個元件的地址;它實際上打印「ciao」。

什麼是我失蹤或我還沒有學到這個?

回答

28

這是運營商< <超載爲const void*const char*。你的char數組轉換爲const char*並傳遞給該超載,因爲它比const void*更適合。然而,int數組轉換爲const void*並傳遞給該版本。運營商< <的版本取const void*只輸出地址。採用const char*的版本實際上將其視爲C字符串,並輸出每個字符直到終止空字符。如果你不希望出現這種情況,將您的字符數組const void*它傳遞給運營商< <明確時:

cout << static_cast<const void*>(arr2) << endl; 
+1

根據[this](http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/),它只會被void *重載。這是否意味着它能夠確定指針是否指向字符,如果是,它會查找終端字符並打印字符串? (仍然有點難倒) – rmp251 2013-10-02 02:17:29

+3

@ rmp251:錯過[這些](http://www.cplusplus.com/reference/ostream/ostream/operator-free/)? – 2014-12-13 22:54:08

0

對於輸出NUL終止字符串的char *有一個標準重載。

4

因爲cout的operator <<過載,char*輸出字符串,而arr2與此相匹配。

如果您想要地址,請嘗試將字符數組轉換爲空指針。

0

雖然鑄造可能是一個更有意義的方式,你也可以使用AddressOf運算符:

cout << &arr2 << endl; 
相關問題