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 Typconst 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.
-
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.
-
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