char, char* und char[]



  • Hallo,

    trotz langem Suchen habe ich den genauen Unterschied zwischen char* und char[] nicht verstanden.

    Warum gibt es einmal eine Methode, die ein char so initialisiert

    ... = "Text im char...";
    

    und eine, die so initialisiert

    ... = { "Text im char..." };
    

    Außerdem - ist char* nicht ein Pointer auf einen char?
    Müsste der dann nicht einfach Adressen von chars speichern können?

    Warum kann man ihn mit Text initialisieren - mit Zeichenketten sogar noch dazu?

    Vielen Dank für eure Geduld und eure Antworten!

    Player894



  • -In einem char ist Platz für 1 Zeichen.

    • char[N] ist Array. In ihm ist Platz für N Zeichen. Alle N Zeichen liegen aufeinanderfolgend im Speicher.
    • "Irgendein Text" ist ein Zeichenkettenliteral vom Typ const char[15] . Zeichenkettenliterale werden im statischen Speicher abgelegt.
    char c = 'c'; // Ein char für 1 Zeichen.
    char car[10]; // Ein Array für 10 chars, also für 10 Zeichen.
    const char* p = "Irgendein Text"; // Ein Zeiger, der auf 1 char zeigt. Er zeigt in dem Fall auf 'I'. Wir wissen ja, dass *(p+n) == p[n] ist. Somit können wir den Zeiger also über das Array schieben.
    
    char car[10] = "Hallo"; // Das hier ist aber kein Zeichenkettenliteral, weil es einfach nur die angenehme Schreibweise für...
    char car[10] = {'H','a','l','l','o'}; // ...ist.
    

  • Mod

    char car[10] = "Hallo"; // Das hier ist aber kein Zeichenkettenliteral, weil es einfach nur die angenehme Schreibweise für...
    char car[10] = {'H','a','l','l','o','\0'}; // ...ist.
    

    FTFY.

    edit: Ja, es ist prinzipiell das gleiche, aber so wird deutlicher, was passiert, wenn man

    char car[] = "Hallo";
    

    schreibt. Das ist dann nämlich nicht das gleiche wie

    char car[] = {'H','a','l','l','o'};
    

    sondern

    char car[] = {'H','a','l','l','o','\0'};
    


  • Korrektur:

    char car[10] = "Hallo"; // Das hier ist aber kein Zeichenkettenliteral, weil es einfach nur die angenehme Schreibweise für...
    char car[10] = {'H','a','l','l','o','\0'}; // ...ist.
    

    und dann gibt es noch

    char a[] = "hallo";
    

    Hier wird die Größe von a automatisch gewählt. Hier ist a dann ein char Array der Größe 6.



  • SeppJ schrieb:

    char car[10] = "Hallo"; // Das hier ist aber kein Zeichenkettenliteral, weil es einfach nur die angenehme Schreibweise für...
    char car[10] = {'H','a','l','l','o','\0'}; // ...ist.
    

    FTFY.

    😃 Danke. Wenn man nur std::string nutzt, vergißt man wohl irgendwann, dass das rohe Zeugs ein Terminierungszeichen hat. 🤡


  • Mod

    out schrieb:

    SeppJ schrieb:

    char car[10] = "Hallo"; // Das hier ist aber kein Zeichenkettenliteral, weil es einfach nur die angenehme Schreibweise für...
    char car[10] = {'H','a','l','l','o','\0'}; // ...ist.
    

    FTFY.

    😃 Danke. Wenn man nur std::string nutzt, vergißt man wohl irgendwann, dass das rohe Zeugs ein Terminierungszeichen hat. 🤡

    Das was du schriebst ist ja sogar zufällig richtig (siehe mein edit oben), da die nicht initialisierten Elemente value-initialized werden, hier also zero-initialized. Aber vermutlich nicht so von dir gemeint 🙂 .



  • SeppJ schrieb:

    out schrieb:

    SeppJ schrieb:

    char car[10] = "Hallo"; // Das hier ist aber kein Zeichenkettenliteral, weil es einfach nur die angenehme Schreibweise für...
    char car[10] = {'H','a','l','l','o','\0'}; // ...ist.
    

    FTFY.

    😃 Danke. Wenn man nur std::string nutzt, vergißt man wohl irgendwann, dass das rohe Zeugs ein Terminierungszeichen hat. 🤡

    Das was du schriebst ist ja sogar zufällig richtig (siehe mein edit oben), da die nicht initialisierten Elemente value-initialized werden, hier also zero-initialized. Aber vermutlich nicht so von dir gemeint 🙂 .

    Zufall 🙂



  • Vielen Dank für die supertollen Antworten!!!

    Ich habe es jetzt verstanden!

    Player894


Anmelden zum Antworten