Ich lese das Kapitel über Arrays und Zeiger in Kernighan und Richies C Programmiersprache .
Sie geben das Beispiel:
%Vor%Und dann sag:
"Da s
ein Zeiger ist, ist das Inkrementieren vollkommen legal; s++
hat keine Auswirkung auf die Zeichenkette in der Funktion, die strlen
aufgerufen hat, sondern erhöht lediglich die private Kopie des Zeigers von strlen. Das bedeutet, dass Anrufe wie
alle arbeiten. "
Ich habe das Gefühl, dass ich das alles verstehe, mit Ausnahme des ersten Aufrufbeispiels: Warum oder wie wird das String-Literal "hello, world"
als char *s
behandelt? Wie ist das ein Zeiger? Benennt die Funktion dieses String-Literal als Wert ihrer lokalen Variablen *s
und dann s
als Array-Name / Zeiger?
Um zu verstehen, wie eine Zeichenfolge wie "Hello World" in einen Zeiger konvertiert wird, ist es wichtig zu verstehen, dass die Zeichenfolge hexadezimale Daten sind, die bei einer Adresse beginnen und solange weitergehen, bis ein NULL
Das bedeutet, dass jede String-Konstante wie "Hello World" irgendwo im Speicher gespeichert wird
Möglichkeit wäre:
%Vor%Wenn also diese Funktion mit den obigen Werten im Speicher aufgerufen wird, ist [linke Seite die Adresse, gefolgt von ':' und die rechte Seite ist der ASCII-Wert des Zeichens]
%Vor% zu diesem Zeitpunkt wird an strlen
der Wert 0x10203040
übergeben, der die Adresse des ersten Elements des Zeichen-Arrays ist.
Beachten Sie, dass die Adresse als Wert übergeben wird. Daher hat strlen
eine eigene Kopie der Adresse von "Hello World". Ausgehend von n = 0
, nach upload finde ich
im Speicher, ich inkrementiere n
s
und auch die Adresse in 0x10203041
(die dann auf
erhöht wird) und so weiter, bis sie %code% findet an der Adresse %code% und gibt die Stringlänge zurück. 0x1020304B
Beachten Sie Folgendes:
"hello, word"
wird irgendwo im Speicher gespeichert So könnte ein Zeiger einfach auf eine statische Zeichenkette wie jede andere (dynamische) Struktur zeigen, die im Speicher gespeichert ist (wie ein Array von Zeichen). Es gibt wirklich keinen Unterschied zu den anderen bereitgestellten Beispielen.
Ordnet die Funktion dieses String-Literal als Wert für ihre lokale Variable * s zu und dann s als den Array-Namen / Zeiger?
verwenden
Ja