Adressen



  • Hallo!

    Habe ein Problem mit Adressen:

    Warum wird hier eine Adresse ausgegeben?

    char a[20] = "Hello World";
        cout << "Array: " << &a << endl;
    

    Hier aber nicht?

    cout << "Array[0]: " << &a[0] << endl;
        cout << "Array[1]: " << &a[1] << endl;
    

    Bei Zeigern hingegen funktioniert es.

    Aber hier wiederum nicht (zumindest nicht richtig):

    char c = 'c';
        cout << "Normal: " << &c << endl;
    


  • Neuling09 schrieb:

    Hallo!

    Habe ein Problem mit Adressen:

    Warum wird hier eine Adresse ausgegeben?

    char a[20] = "Hello World";
        cout << "Array: " << &a << endl;
    

    weil &a die Adresse eines char-Arrays zurückgibt, also einen "char **", wenn du so willst

    Hier aber nicht?

    cout << "Array[0]: " << &a[0] << endl;
        cout << "Array[1]: " << &a[1] << endl;
    

    a[0] ist ein char und &a[0] ein char * ➡ &a[0] wird als nullterminierte Zeichenkette ausgewertet, also bis nach Hello World.
    mit &a[1] verhält es sich genauso

    Aber hier wiederum nicht (zumindest nicht richtig):

    char c = 'c';
        cout << "Normal: " << &c << endl;
    

    genau das gleiche.

    Wenn du unbedingt eine Adresse aus einem Element eines char-Arrays ausgeben willst, dann z.B. so:

    std::cout << "0x" << std::hex << reinterpret_cast<std::size_t>(&a[0]) << std::endl
    

  • Administrator

    Paul Manns schrieb:

    weil &a die Adresse eines char-Arrays zurückgibt, also einen "char **", wenn du so willst

    Falsch! &a ist gibt die Adresse auf das Array Objekt zurück. Also ein char (*)[20] . Seltsamer Typ, aber er existiert:

    char a[20];
    char** p1 = &a;      // FEHLER
    char* p2 = &a;       // FEHLER
    char (*p3)[20] = &a; // RICHTIG
    

    Paul Manns schrieb:

    std::cout << "0x" << std::hex << reinterpret_cast<std::size_t>(&a[0]) << std::endl
    

    Das geht einfacher:

    std::cout << static_cast<void*>(&a[0]) << std::endl;
    
    char c = 'c';
    std::cout << &c << std::endl;
    

    Dies löst übrigens undefiniertes Verhalten aus. Ganz lustiger Fehler, irgendwie. char* , const char* , wchar_t* und const wchar_t* werden von den Streams immer als nullterminierte Strings angeschaut. Sie werden also wie Zeiger auf Arrays behandelt und es werden Zeichen ausgegeben, bis ein 0 Byte gefunden wird.

    Grüssli



  • Das ist eigenartig. Hab es eben mit int versucht und es hat geklappt.

    Aber warum funktioniert das mit einem char Datentypen nicht?

    Ich danke dir Paul! 👍



  • Dravere schrieb:

    Dies löst übrigens undefiniertes Verhalten aus. Ganz lustiger Fehler, irgendwie.

    Ja eben, bei mir wurde auch das ganze Array ausgegeben.



  • Dravere schrieb:

    Paul Manns schrieb:

    weil &a die Adresse eines char-Arrays zurückgibt, also einen "char **", wenn du so willst

    Falsch! &a ist gibt die Adresse auf das Array Objekt zurück. Also ein char (*)[20] . Seltsamer Typ, aber er existiert:

    char a[20];
    char** p1 = &a;      // FEHLER
    char* p2 = &a;       // FEHLER
    char (*p3)[20] = &a; // RICHTIG
    

    und wieder was dazugelernt^^ 🙂


Anmelden zum Antworten