Dies mag eine einfache Frage sein, aber warum benötigt ein const char * keine Speicheradresse, auf die es verweisen kann?
Beispiel:
const char* a = "Anthony";
und nicht:
const char *a = // Address to const char
wie alle anderen Typen?
c++
c
implicit-conversion
c-strings
string-literals
Weidelix
quelle
quelle
Antworten:
Sie können sich diese Erklärung vorstellen
der folgende Weg
Das heißt, der Compiler erstellt ein Array von Zeichen mit der statischen Speicherdauer, in der die Zeichenfolge gespeichert ist,
"Anthony"
und die Adresse des ersten Zeichens des Arrays (aufgrund der impliziten Konvertierung von Array-Bezeichnern in Zeiger auf ihre ersten Zeichen) wird dem Zeiger zugewiesena
.Hier ist ein Demonstrationsprogramm, das zeigt, dass Zeichenfolgenliterale Zeichenarrays sind.
Die Programmausgabe ist
Die Größe des Zeichenfolgenliteral (des Arrays, in dem das Zeichenfolgenliteral gespeichert ist) ist gleich,
8
da die Zeichenfolge auch das abschließende Nullzeichen 'enthält\0'
.Im Demonstrationsprogramm der Ausdruck
kann nur für den Ausdruck ersetzt werden
quelle
Es tut.
Ein C-String-Literal wie
wird an die Adresse seines 1 abgeklungen st Charakter. Wie übrigens; Jedes Array in C tut dies.
quelle
const char[8]
(in C ++ möglicherweisechar [8]
in C, nicht sicher) und wie alle integrierten Arrays, wenn es als Wert verwendet wird, zerfällt es in einen Zeiger auf sein erstes Element.char [8]
in C: c-faq.com/ansi/strlitnotconst.htmlEs benötigt eine Speicheradresse und es hat eine Speicheradresse. In Ihrem Beispiel ist es einfach die Speicheradresse am Anfang der Zeichenfolge. Dies gilt auch für alle anderen Array-Variablen, die zur Kompilierungszeit initialisiert werden, z. B. "int array [] = {0, 1, 2, 3};".
Wenn Sie einen binären Editor verwenden, um die ausführbare Datei anzuzeigen, wird dort die Zeichenfolge "Anthony" angezeigt. Wenn Sie die Zeile "printf (" a steht bei% p \ n ", (void *) a);" Wenn Sie es in Ihrem Programm kompilieren und ausführen, wird die Adresse angezeigt.
quelle
In der Tat, es hat eine Speicheradresse zu Punkt müssen.
const char* a
meansa
ist ein Zeiger auf ein String-Literal oder eine Zeichenkonstante.Ein Zeiger benötigt immer eine Adresse, auf die er zeigen muss, da es die Natur eines Zeigers ist, auf ein bestimmtes Objekt im Speicher zu zeigen. Also,
a
und jeder andere Zeiger aufconst char
tut es auch.Ein String-Literal wie
"Hi My Name is Alfred!"
durch eine Zuweisung wie:zerfällt in einen Zeiger auf die Adresse des ersten Elements des String-Literal.
Bedeutet wiederum,
a
wird durch die Adresse des ersten Elements des Zeichenfolgenliteral zugewiesen, das"Hi My Name is Alfred!"
abhängig von der Ausführungsumgebung an einer beliebigen Stelle im Speicher gespeichert werden kann.Es liegt nicht in der Macht eines Programmierers, wo ein String-Literal genau gespeichert ist. Ihre Aufgabe besteht nur darin, den jeweiligen Zeiger entsprechend zuzuweisen und zu behandeln.
quelle