2017-02-07 4 views
1

Zum Beispiel:Wie kann ein Zeiger eine Zeichenfolge als Wert haben?

const char* f = "123"; 

Soweit ich das beurteilen kann, hat f die Adresse als seinen Wert. Aber warum? Sollte es keinen Fehler erzeugen?

+0

Sogar String-Literale haben eine Speicheradresse. –

+1

Siehe diese Antwort: http://stackoverflow.com/a/9633233/1865694 –

+1

Es ist keine Zeichenfolge. Es ist eine temporäre Reihe von Zeichen. –

Antwort

3

Der Wert des Zeigers ist nicht die Zeichenfolge, sondern die Speicheradresse des ersten Zeichens im Zeichenfolgenliteral.

Dies ist eine ausreichende Information, da String-Literale null-terminiert sind. Was passiert ist ein Array von Zeichen der Größe (Anzahl der Zeichen) +1 wird im Speicher erstellt. Der Wert des letzten Zeichens im Array ist '\0' (wörtlich alle Bits Null), was das Ende des String-Literals signalisiert, so dass der Code, der dieses Array sequenziell liest, weiß, dass er diesen Index nicht überschritten hat.

+0

Die Sprache gibt das an. Das ist die Bedeutung von "123". – SU3

+0

Woher weiß der Compiler, was ich meinte? Mit derselben Logik sollte int * f = 2 bedeuten, dass f die Adresse ist, an der 2 gespeichert wird, aber nicht. –

+1

Nein, das ist nicht die gleiche Logik. '2' und' 2' sind zwei verschiedene Dinge. Sie können sich String-Literale als Sonderfall vorstellen. Der Typ von "123" ist "const char [4]". Das ist ein Array von 'char' der Größe 4. Sie können das einem Zeiger zuweisen, da Array-Typen zu Zeigern auf das erste Element verfallen. – SU3

1

Die Literalzeichenfolge "123" wird beim Ausführen des Programms aus der Programmdatei in den Prozessspeicher kopiert. In der Regel werden Literale in einem Nur-Lese-Speicher abgelegt. Deshalb ist const erforderlich, wenn auf Zeichenfolgenliterale verwiesen wird. Und f zeigt auf das erste Zeichen des Literals.

const char *f = "123"; 
// f[0] is '1' 
// f[1] is '2' 
// f[2] is '3' 
// f[3] is '\0' 
Verwandte Themen