2014-07-16 53 views
2

我想了解C++中的指針和數組。我注意到,在下面的代碼中,輸出a正確地給出了array中第一個元素的地址,但是輸出c給出了pk而不是地址。字符數組指針與C++中的整數數組

int array[3]={4,7,2}; 
int * a; 

a= array; 

char Carray[3]={'p','k','\0'}; 
char * c; 

c= Carray; 

cout << a << "\n"; 
cout << c << "\n"; 

這是不正確的方式找到的第一個元素在Carray地址?或者這是cout如何解釋整數和字符數組的指針的一些怪癖。

輸出:

Ox23fe30 
pk 
+0

請向我們展示您從這些語句中獲得的輸出。 – turbulencetoo

+0

C風格的字符串是以char char'\ 0'結尾的'char'數組,並且'cout'假設您傳遞了一個C風格的字符串。所以你得到第一個元素地址的方法是正確的,但'cout'對那個地址的解釋對於'int'和'char'是不同的。 –

+0

除非你特別要求與C或類似的東西進行比較,否則不要用C標記你的C++問題 - 語言和他們慣用的答案可能會有很大的不同。 – crashmstr

回答

0

cout解釋以不同的方式比說INT指針字符指針,所以你得到的第一個數組元素的地址的方式是確定的。

1

這是一個來自C的「怪癖」。在C中,一串字符是以空字符結尾的char[]cout允許使用C風格的字符串,所以它輸出字符指針就好像它是一個字符串。

6

這是一個怪癖cout如何解釋字符數組的指針。

當給定指針時,cout將打印地址,除非它是char*,在這種情況下,它將指針解釋爲c樣式字符串(指向字符數組的結尾將爲空字節)。

要打印字符數組的地址,將其轉換爲void*第一:cout << reinterpret_cast<void*>(c) << "\n";

5

隨着c,你打電話operator<<(std::istream&, char*)。這只是打印字符,直到它碰到'\0',就像一個普通的舊式C字符串。

aoperator<<(std::istream&, int*)打印地址。

+0

技術上我認爲重載是'operator <<(std :: istream&,void *)' –

0

指向char的指針通常在C和C++中被視爲以NULL結尾的字符串。對於諸如cout之類的STL流,char指針肯定被視爲NULL結尾的字符串。