Warum druckt cout char-Arrays anders als andere Arrays?

Lesezeit: 1 Minute

Warum druckt cout char Arrays anders als andere Arrays
Luca Matteis

Ich verwende C++, um zu verstehen, wie Zeiger genau funktionieren. Ich habe dieses Stück Code, das Arrays verwendet, die ich nur verwende, um zu verstehen, wie das Äquivalent mit Zeigern funktioniert.

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

Wenn ich dies jedoch ausführe, arr gibt die Adresse des ersten Elements des Arrays von ints (wie erwartet) aus, aber arr2 gibt nicht die Adresse des ersten Elements des Zeichenarrays aus; es druckt tatsächlich “ciao”.

Was ist es, das ich vermisse oder was ich noch nicht darüber gelernt habe?

Es ist der Operator<<, für den überladen wird const void* und für const char*. Ihr char-Array wird konvertiert in const char* und zu dieser Überladung übergegangen, weil es besser passt als zu const void*. Das int-Array wird jedoch konvertiert const void* und an diese Version weitergegeben. Die Version von operator<< nimmt const void* gibt nur die Adresse aus. Die Version unter der const char* behandelt es tatsächlich wie einen C-String und gibt jedes Zeichen bis zum abschließenden Nullzeichen aus. Wenn Sie das nicht möchten, konvertieren Sie Ihr char-Array in const void* explizit bei der Übergabe an operator<<:

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

  • Entsprechend Das es ist nur für void* überladen. Bedeutet das, dass es feststellen kann, ob der Zeiger auf Zeichen zeigt, und wenn ja, sucht es nach dem Endzeichen und gibt die Zeichenfolge aus? (noch etwas ratlos)

    – rmp251

    2. Oktober 2013 um 2:17 Uhr

  • @rmp251: Verpasst diese?

    – Ben Voigt

    13. Dezember 2014 um 22:54 Uhr


1646937008 164 Warum druckt cout char Arrays anders als andere Arrays
crashmstr

Weil Cout ist operator << ist überlastet für char* um Zeichenfolgen auszugeben, und arr2 passt dazu.

Wenn Sie die Adresse möchten, versuchen Sie, das Zeichenarray als void-Zeiger umzuwandeln.

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

Während Casting wahrscheinlich ein sinnvollerer Ansatz ist, könnten Sie auch den addressof-Operator verwenden:

cout << &arr2 << endl;

988680cookie-checkWarum druckt cout char-Arrays anders als andere Arrays?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy