2009-02-01 13 views
13

Ich benutze C++, um zu verstehen, wie genau Zeiger funktionieren. Ich habe dieses Stück Code mit Arrays, die ich nur verwenden, um zu verstehen, wie das Äquivalent mit Zeigern funktioniert.Warum druckt Char-Char-Arrays anders als andere Arrays?

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

Jedoch, wenn ich dies auszuführen, gibt arr die Adresse des ersten Elements des Arrays von ints (wie erwartet), aber arr2 nicht ausgibt, die Adresse des ersten Elements der Reihe von Zeichen; es druckt tatsächlich "ciao".

Was fehlt mir oder dass ich noch nichts davon gelernt habe?

Antwort

28

Es ist der Betreiber < <, die für const void* und für const char* überlastet ist. Ihr Char-Array wird in const char* konvertiert und an diese Überladung übergeben, weil es besser als const void* passt. Das int-Array wird jedoch in const void* konvertiert und an diese Version übergeben. Die Version des Operators < < unter const void* gibt nur die Adresse aus. Die Version, die die const char* übernimmt, behandelt sie tatsächlich wie eine C-Zeichenfolge und gibt jedes Zeichen bis zum abschließenden Nullzeichen aus. Wenn Sie nicht wollen, dass, konvertieren Sie Ihre char-Array zu const void* explizit, wenn es um Bediener vorbei < <:

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

Nach [dieser] (http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/) ist es nur für void * überladen. Bedeutet das, dass er feststellen kann, ob der Zeiger auf Zeichen zeigt, und wenn ja, ob er nach dem Terminalzeichen sucht und die Zeichenkette ausgibt? (noch ein wenig ratlos) – rmp251

+3

@ rmp251: Verpasst [diese] (http://www.cplusplus.com/reference/ostream/ostream/operator-free/)? –

0

Es gibt eine Standardüberladung für char *, die eine NUL-terminierte Zeichenfolge ausgibt.

4

Weil Couts operator << überlastet ist für char*, um Strings auszugeben, und arr2 entspricht das.

Wenn Sie die Adresse möchten, versuchen Sie, das Zeichenarray als ungültigen Zeiger zu verwenden.

0

Während Gießen wahrscheinlich ein sinnvoller Ansatz ist, können Sie auch den AddressOf-Operator verwenden:

cout << &arr2 << endl; 
+0

Wahrscheinlich wollen '& arr2 [0]' anstelle von '& arr2' hier –

+0

Das sind die gleichen Adressen, Shawley. –

+0

Ein Array in C/C++ ist nur eine Reihe von Speicherorten. Die Adresse des Arrays ist also die Adresse des ersten Elements. Frage mich, warum dies gewählt wurde – Mystic

Verwandte Themen