Ich hatte nie Probleme mit Referenzen wie in Python (implizit) oder PHP (explizit & amp;). In PHP schreibst du $p = &$myvar;
und du hast $p
als Referenz, die auf $myVar
zeigt.
Also ich weiß in C ++ können Sie dies tun:
%Vor% Nicht & amp; meine "Speicheradresse von" x in C ++? Was mache ich dann, wenn var nur die Adresse zu myInt
und kein Zeiger ist?
Ich verstehe nicht den Unterschied zwischen * und & amp; in C ++ vollständig. Sie sagen dir & amp; wird verwendet, um die Adresse einer Variablen zu erhalten, aber warum hilft Ihnen das bei Funktionen usw. wie im ersten Beispiel?
Im ersten Beispiel wird &
verwendet, um einen Referenztyp zu deklarieren.
Das ist nicht dasselbe wie der Operator &
, der verwendet wird, um die Adresse eines Objekts abzurufen.
Sie können einen Referenztyp als einen Typ anzeigen, der unter dem Cover einen Zeiger verwendet, der niemals NULL
sein kann.
Nicht & amp; meine "Speicheradresse von" x in C ++?
Kurze Antwort: Das hängt davon ab.
Längere Antwort: Der unäre Präfixoperator &
liefert, wenn er auf ein Objekt angewendet wird, tatsächlich die -Adresse des Objekts: &obj
. Es gibt jedoch auch den Modifizierer &
, der, wenn er auf einen Typ angewendet wird, diesen zu einem Referenztyp <ändert / em> : int&
.
Dasselbe gilt für *
: Bei Verwendung als unärer Präfix-Operator wird dereferenziert ein Zeiger: *ptr
. Bei Verwendung als Modifikator wird der Typ als -Zeiger geändert: int*
.
Es ist auch nicht hilfreich, dass type-Modifizierer auf die Variable angewendet werden, die deklariert ist. Zum Beispiel das
%Vor% definiert einen int
-Zeiger, einen Zeiger auf einen Zeiger auf ein int
, ein vanilla int
und ein int
reference. (Letzteres wird sofort initialisiert, da Sie keinen nicht initialisierten Verweis haben können.) Beachten Sie, dass die -Typ-Modifikatoren syntaktisch zu der deklarierten Variablen gehören, deren Typ sie ändern, nicht zum Typ der angegebenen Variablen Die Modifikatoren type ( *
und &
) ändern jedoch den -Typ der Variablen.
Im folgenden Fall wird jedoch mit p
und i
angenommen, dass es sich um Variablen handelt, die bereits deklariert wurden
*
und &
sind unäre Präfixoperatoren, die pp
dereferenzieren und die Adresse von i
liefern.
(Der Modifizierer type []
ändert den Typ der Variablen bei der Deklaration auf eine Variable, während das < strong> binärer Infixoperator []
, wenn er auf ein Objekt vom Typ Array angewendet wird, greift auf eines seiner Unterobjekte zu.)
Um die Dinge noch weiter zu komplizieren, gibt es neben den Typ-Modifikatoren und den unären Präfix-Operatoren &
und *
auch die binäre Infixoperatoren &
und *
, was "bitweise UND" und "Multiplikation" bedeutet. Und um die Verletzung zu beleidigen, können Sie in C ++ überladen sowohl die unäre Präfix und die binäre Infix Varianten dieser Operatoren (und die binäre Infix []
) für benutzerdefinierte Typen und bezüglich ihrer Semantik völlig frei sein.
Tatsächlich dient der & amp; -Operator zwei Zwecken, wie oben beschrieben.
Der erste Zweck ist die Dereferenzierung, die so verwendet wird:
%Vor%Der & amp; -Operator wird in der Bedeutung 'gib mir die Speicheradresse von'
verwendetDer zweite Zweck besteht darin, Call-by-Reference zu emulieren (was c nicht nativ hat)
eine Erklärung wie
%Vor%bewirkt, dass die Funktion foo einen int-Parameter akzeptiert, zu dem jede Änderung während der Ausführung von foo zurückgegeben wird.
Ohne den & amp; -Operator würden Änderungen an theInt nur im Bereich von foo vorgenommen und verworfen, sobald die Funktion beendet ist.
Im zweiten Beispiel sollte
sein %Vor% Stellen Sie sich das kaufmännische Und in der Argumentdeklaration als das var
-Schlüsselwort in Pascal vor. Es wird verwendet, um anzugeben, dass die Variable aktualisiert wird, wenn sie geändert wird. Ich bin mir nicht sicher, ob die C ++ - Semantik angibt, dass sie immer als Referenz übergeben wird, oder dass sie über einen Wert übergeben und bei der Rückgabe kopiert werden kann, wenn sie für einen bestimmten Fall effizienter ist ...
Tags und Links c++