Für mich scheint es, dass Sie Verwirrung darüber haben, was ein Zeiger tut und wo *
gehört.
Zeiger ist ein spezieller Objekttyp, der auf ein anderes Objekt, nicht von ein Objekt zeigt.
Pointer kann wie folgt erklärt werden:
int *a;
Hier *
gibt an, dass a
ein Zeiger ist. Zeigerarten unterscheiden sich vom Typ des Objekts, auf das sie verweisen.
Aber was a
zeigt, ist unbestimmt. Sie müssen eine Adresse zuweisen, um a
Punkt auf etwas zu machen. Um das zu tun, lassen Sie uns eine ganze Zahl machen (hier mit dem Wert initialisiert 2
):
int b = 2;
Und lassen a
Punkt b
:
a = &b;
Hier ist der einstellige &
Operator wird verwendet b
‚s nehmen Adresse. Und Sie ordnen dies a
und dann a
Punkte b
zu.
Natürlich kann ein Zeiger auch initialisiert werden. Vorstehende Angaben können ersetzt werden:
int b = 2;
int *a = &b;
Dann, wie Sie von a
b
‚s Wert erhalte?Sie können dies tun, indem dereferencinga
:
std::cout << *a << std::endl;
Dieser druckt 2
. Der unäre Operator *
wird hier verwendet zu dereferenza
. Diese *
unterscheidet sich von der *
, die oben für a
deklariert wurde und sollte nicht verwechselt werden.
++*a;
Dies erhöht b
. b
hat jetzt den Wert 3
.
Sie können a
Punkt zu einem anderen Objekt, indem Sie eine andere Adresse zuweisen:
int c = 3;
a = &c;
Jetzt a
Punkte c
statt b
.
Sie können einen Zeiger kopieren, die auf das gleiche Objekt zeigen wird:
int *d = a;
Jetzt d
Punkte c
, die a
auch auf die Punkte.
Referenzen unterscheiden sich von Zeiger:
int &e = b;
&
hier verwendet wird e
ist eine Referenz angeben. Diese &
unterscheidet sich von der &
, die verwendet wird, um eine Adresse zu nehmen und sollte nicht verwechselt werden. Hier, e
bezieht sich auf b
.
Sie auf ein Objekt beziehen und immer so, als ob sie das Objekt waren:
++e;
Dies erhöht b
.
b
hat jetzt den Wert
4
.
Anders als Zeiger, müssen Verweise auf ein Objekt beziehen sich immer:
int &f; // error
Eine Referenz kann auch auf einen Zeiger verweisen:
int *&g = a;
g
bezieht sich auf a
.
Aber ein Zeiger kann nicht auf einen Bezugspunkt:
int &*h = &e; // error
Sie scheinen Missverständnis zu sein, was '->' bedeutet. Es bedeutet keine Richtung, es ist nur eine Kurzform für die Dereferenzierung eines Zeigers auf eine Struktur gefolgt von Strukturelementzugriff. Für einen Zeiger auf eine Struktur "a" und ein Element "b" ist der Ausdruck "a-> b" gleich "(* a) .b". *** Auch der '->' Operator bedeutete früher etwas anderes in der C Sprache (woher es kommt). Lesen Sie z.B. [diese alte Antwort] (http://stackoverflow.com/a/13366168/440558) für weitere Details. –
http://Stackoverflow.com/a/6586248/6543574 Hier wird erklärt, hoffe das hilft :) – Lanfear
'a * b' _never_ bedeutet, dass' a' ein Zeiger auf 'b' ist. Die nächstliegende Bedeutung ist, dass als Teil einer Deklaration "b" ein Zeiger auf ein "a" ist (wobei "a" ein _type_ ist).In Ausdrücken ruft 'a * b' die Multiplikation auf. – davmac