Ich bekomme das C ++ Pointer / Reference-System einfach nicht

8

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%
  • Myint ist jetzt 123, warum?

Nicht & amp; meine "Speicheradresse von" x in C ++? Was mache ich dann, wenn var nur die Adresse zu myInt und kein Zeiger ist?

%Vor%
  • Funktioniert das obige wie erwartet?

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?

    
gnm 19.04.2010, 12:42
quelle

5 Antworten

11

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.

    
Bastien Léonard 19.04.2010, 12:44
quelle
28
  

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

%Vor%

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

    
sbi 19.04.2010 12:49
quelle
1

& wird in Funktionen verwendet, wenn Sie mehr als einen Variablenwert zurückgeben müssen, im Gegensatz zur return -Anweisung, die eine einzelne Variable zurückgibt.

    
cpx 19.04.2010 12:47
quelle
1

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'

verwendet

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

    
sum1stolemyname 19.04.2010 12:52
quelle
0

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

    
fortran 19.04.2010 12:47
quelle

Tags und Links