2017-02-23 3 views
-1

Ich weiß, dass -> Operator ein Zeiger auf die Richtung der Variablen sein kann, aber warum es verwenden, wenn Sie * Zeiger-Operator haben, was ist der Unterschied, und kann ich lieber einen über den anderen? zum Beispiel:Unterschied zwischen -> Operator und der Zeiger * (C++)

a*b 

bedeutet ein Zeiger auf B (rechts konnte ich falsch vergib mir sein, weil ich ein Anfänger bin?)

ist es gleichbedeutend mit a->b?

und a<-b Bedeutung b ist ein Zeiger auf ein?

Wenn ja, ist es möglich, sich auf -> zu verlassen, weil es einfacher ist?

+1

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. –

+0

http://Stackoverflow.com/a/6586248/6543574 Hier wird erklärt, hoffe das hilft :) – Lanfear

+2

'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

Antwort

2

a*b bedeutet normalerweise "multiplizieren a und b". C++ hat nur sehr wenige lexikalische Elemente, und viele von ihnen dienen vielen verschiedenen Zwecken, daher ist der Kontext wichtig.

a->b ist und Zugangselement entspricht (*a).b, d.h. zuzugreifen das b Mitglied des Wertes von a spitz.

Beachten Sie, dass die Operatoren * und -> überlastet werden können.

+0

ich wollte es a * b machen, zum Beispiel int a * b –

+0

Du meinst 'int a, * b;'? –

+0

@AhmedDhia: C++ ist whitespace-unempfindlich. –

1

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 ab ‚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, ebezieht 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 
+0

Vielen Dank :) Das hat die Dinge klar, aber eine Frage, wie verhindere ich, dass die Ausgabe die Speicheradresse oder den Ort eines Zeigers ausgibt? –

+0

Sie sollten den Ausgabeströmen einfach keine Speicheradresse geben. Nach den obigen Beispielen gibt 'std :: cout << d << std :: endl' die Adresse von 'c' aus. –

Verwandte Themen