Vergleich von Referenzen und Zeigern in C++

Referenzen sind ein Konzept in C++. Anfänger neigen dazu, Referenzen mit Zeigern zu verwechseln.

Im folgenden Programm ist n eine Referenz auf m, und m ist das referenzierte Objekt.

int m; 
int &n = m; 

n ist gleichbedeutend mit einem Alias (Spitznamen) für m. Jede Operation auf n ist eine Operation auf m.

Also ist n weder eine Kopie von m noch ein Zeiger auf m; tatsächlich ist n m selbst.

Regeln für Referenzen:

  • (1) Eine Referenz muss bei ihrer Erstellung initialisiert werden (ein Zeiger kann jederzeit initialisiert werden).
  • (2) Es kann keine NULL-Referenz geben; eine Referenz muss mit einer gültigen Speichereinheit verknüpft sein (ein Zeiger kann NULL sein).
  • (3) Sobald eine Referenz initialisiert ist, kann die Referenzbeziehung nicht geändert werden (ein Zeiger kann das Objekt, auf das er zeigt, jederzeit ändern).

Im folgenden Beispielprogramm wird k als Referenz auf i initialisiert.

Die Anweisung k = j ändert k nicht dahingehend, eine Referenz auf j zu werden; sie ändert nur den Wert von k auf 6.

Da k eine Referenz auf i ist, wird der Wert von i ebenfalls zu 6.

int i = 5; 
int j = 6; 
int &k = i; 
k = j; // k 和 i 的值都变成了 6;

Der Hauptzweck von Referenzen ist es, Funktionsparameter und Rückgabewerte zu übergeben.

In C++ gibt es drei Möglichkeiten, Funktionsparameter und Rückgabewerte zu übergeben: Wertübergabe, Zeigerübergabe und Referenzübergabe.

Im Folgenden sehen Sie ein Beispielprogramm für die "Wertübergabe".

Da x im Funktionskörper von Func1 eine Kopie der externen Variablen n ist, wirkt sich eine Änderung des Werts von x nicht auf n aus, sodass der Wert von n 0 bleibt.

void Func1(int x) 
{ 
    x = x + 10; 
} 
... 
int n = 0; 
Func1(n); 
cout << "n = " << n << endl; // n = 0 

Im Folgenden sehen Sie ein Beispielprogramm für die "Zeigerübergabe".

Da x im Funktionskörper von Func2 ein Zeiger auf die externe Variable n ist, führt eine Änderung des Inhalts, auf den der Zeiger zeigt, dazu, dass sich der Wert von n ändert, sodass der Wert von n 10 wird.

void Func2(int *x) 
{ 
    (* x) = (* x) + 10; 
} 
... 
int n = 0; 
Func2(&n); 
cout << "n = " << n << endl; // n = 10 

Im Folgenden sehen Sie ein Beispielprogramm für die "Referenzübergabe".

Da x im Funktionskörper von Func3 eine Referenz auf die externe Variable n ist, sind x und n dasselbe. x zu ändern ist gleichbedeutend mit n zu ändern, sodass der Wert von n 10 wird.

void Func3(int &x) 
{ 
    x = x + 10; 
} 
... 
int n = 0; 
Func3(n); 
cout << "n = " << n << endl; // n = 10

Wenn Sie die drei obigen Beispielprogramme vergleichen, werden Sie feststellen, dass sich die "Referenzübergabe" wie die "Zeigerübergabe" verhält, aber wie die "Wertübergabe" geschrieben wird.

Tatsächlich können "Zeiger" alles, was "Referenzen" können, ebenfalls tun. Warum brauchen wir dann noch "Referenzen"?

Die Antwort lautet: "Verwenden Sie das richtige Werkzeug für die richtige Aufgabe."

Zeiger können alles im Speicher ohne Einschränkungen manipulieren. Obwohl Zeiger mächtig sind, sind sie sehr gefährlich.

Wenn Sie wirklich nur einen "Alias" für ein Objekt ausleihen müssen, dann verwenden Sie eine "Referenz" anstelle eines "Zeigers", um Unfälle zu vermeiden.