Übergeben eines String-Literals als Funktionsparameter, der als Zeiger definiert ist

8

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

%Vor%

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?

    
Dmitry Minkovsky 21.01.2013, 19:21
quelle

4 Antworten

11

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

gefunden wird

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 n im Speicher, ich inkrementiere s und auch die Adresse in 0x10203041 (die dann auf 0x1020304B erhöht wird) und so weiter, bis sie %code% findet an der Adresse %code% und gibt die Stringlänge zurück.

    
Aniket Inge 21.01.2013 19:38
quelle
3

"hello, world"

ist ein Array von char (Typ ist char[13] ). Der Wert eines Arrays von char in einem Ausdruck ist ein Zeiger auf char . Der Zeiger zeigt auf das erste Element des Arrays (d. H. Der Wert von "hello, world" ist &"hello, world"[0] ).

    
ouah 21.01.2013 19:24
quelle
1

Beachten Sie Folgendes:

  • Ein Zeiger ist (im Grunde genommen) ein Wert, der auf eine Speicheradresse zeigt.
  • Eine statische Zeichenfolge wie "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.

    
Veger 21.01.2013 19:25
quelle
1
  

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

    
Sibi Rajasekaran 21.01.2013 19:27
quelle

Tags und Links