Ich bin Neuling auf C. Ich muss verstehen, was jeder der auf dem Bildschirm gedruckten Werte mit dem folgenden Code bedeutet:
%Vor%Ausgabe (GCC):
%Vor% Hier habe ich die Variable x
und ptr
Punkt auf x
Variable deklariert. Also, *ptr
gedruckter Wert von x
. Aber ich konnte die Werte von **&ptr
und 2**ptr
nicht verstehen.
Vielen Dank im Voraus.
Hier heben sich die Operatoren *
und &
gegenseitig auf, wenn sie nacheinander verwendet werden.
**&ptr
ist das gleiche wie *ptr
und hier, ptr
enthält die Adresse von x
variable. Also, drucke hier den Wert von x
.
2**ptr
wird als 2 * (*ptr)
interpretiert. Also, 2 * (10)
ist gleich 20
.
&
und *
sind unäre Operatoren, die eine entgegengesetzte Bedeutung 1 von der anderen haben.
&(lvalue)
bedeutet, die Adresse des entsprechenden lvalue
zurückzugeben, während *(lvalue)
bedeutet, dass der Wert von der Adresse, auf die lvalue verweist, unter Berücksichtigung des Typs von lvalue zurückgegeben wird, um zu wissen, wie dereferenziert wird.
Optisch sieht die Bedeutung dieser Operatoren so aus (mein Talent in artist-mode
von emacs
ist nicht zu groß):
Beachten Sie, dass ich innerhalb der Box den richtigen Wert markiert habe, während außerhalb der Box die Adressen des Speichers der linken Werte der entsprechenden Speicherorte.
Wenn Sie jetzt *&(lvalue)
schreiben, bedeutet das, dass Sie den Wert von der Adresse von lvalue erhalten, die in Kürze lvalue
geschrieben wird.
Also **&ptr
bedeutet *ptr
- nämlich der Wert aus dem Adresszeiger nach ptr, der als Integer dereferenziert ist, in Ihrem Fall 10.
Der Lexer teilt den Code in Token und der Parser erstellt einen Baum wie diesen:
%Vor% In diesem Fall ist das Ergebnis 2 mal der Wert aus der Adresse von ptr
, in Ihrem Fall 20
.
int *ptr
zeigt auf int x.
printf("%d\n", *ptr);
bedeutet - nimm Wert wo prt
Punkte. Also * ptr ist x
value.
printf("%d\n", **&ptr);
- & amp; ptr ist die Adresse des Zeigers und *&ptr
ist der Wert in ptr
. Und der Wert von &ptr
ist die Adresse von x
. Also **&ptr
ist der Wert von x
printf("%d\n", 2**ptr);
- 2 multipliziert mit dem Wert in ptr. Es bedeutet 2 * x
ptr ist eine Zeigervariable. Diese Zeigervariable zeigt auf den Speicherort, an dem der Wert von x gespeichert ist. * ptr greift auf den Wert zu, auf den die Zeigervariable zeigt.
Jetzt & amp; ist ein Adressenoperator in C. & amp; ptr gibt die Adresse von ptr zurück. Also gibt * & amp; ptr den Wert von der Adresse von ptr zurück. Also * und & amp; werden sich gegenseitig zunichte machen. Das ist ptr und * & amp; ptr sind ein und dasselbe.
ptr = *&ptr => *ptr = **&ptr
Daher ist der Wert 10.
2 ** ptr ist nichts anderes als 2 * (* ptr). Daher ist der Wert 20.
Tags und Links c reference pointers dereference