Was bedeuten "** & ptr" und "2 ** ptr" von C pointer?

8

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.

    
skc 28.10.2017, 08:06
quelle

4 Antworten

30

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 .

    
rsp 28.10.2017, 08:09
quelle
9
%Vor%

& 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ß):

%Vor%

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.

%Vor%

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 .

    
alinsoar 28.10.2017 08:19
quelle
2

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

    
Gor Asatryan 28.10.2017 08:53
quelle
0

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.

    
Saathvik 28.10.2017 08:35
quelle

Tags und Links