Voraussetzung: Hinweise , Verweise
C und C++ unterstützen Zeiger, was sich von den meisten anderen Programmiersprachen wie Java, Python, Ruby, Perl und PHP unterscheidet, da sie nur Referenzen unterstützen. Aber interessanterweise unterstützt C++ neben Zeigern auch Referenzen.
Oberflächlich betrachtet sind sowohl Referenzen als auch Zeiger sehr ähnlich, da beide verwendet werden, um einer Variablen den Zugriff auf eine andere zu ermöglichen. Da beide Mechanismen weitgehend die gleichen Funktionen bieten, ist oft unklar, was der Unterschied zwischen diesen Mechanismen ist. In diesem Artikel werde ich versuchen, die Unterschiede zwischen Zeigern und Referenzen zu veranschaulichen.
Hinweise : Ein Zeiger ist eine Variable, die die Speicheradresse einer anderen Variablen enthält. Ein Zeiger muss mit dereferenziert werden * Der Operator kann auf den Speicherort zugreifen, auf den er verweist.
Verweise : Eine Referenzvariable ist ein Alias, also ein anderer Name für eine bereits vorhandene Variable. Eine Referenz wird ebenso wie ein Zeiger durch die Speicherung der Adresse eines Objekts implementiert.
Eine Referenz kann man sich als einen konstanten Zeiger vorstellen (nicht zu verwechseln mit einem Zeiger auf einen konstanten Wert!) mit automatischer Indirektion, d. h. der Compiler wendet den an * Betreiber für Sie.
int i = 3; // A pointer to variable i or 'stores the address of i' int *ptr = &i; // A reference (or alias) for i. int &ref = i;>
Unterschiede :
1. Initialisierung: Ein Zeiger kann folgendermaßen initialisiert werden:
int a = 10; int *p = &a; // OR int *p; p = &a;>
Wir können den Zeiger im selben Schritt oder in mehreren Zeilen deklarieren und initialisieren.
Was ist ein Doppel-Java?
2. Während in Referenzen,
int a = 10; int &p = a; // It is correct // but int &p; p = a; // It is incorrect as we should declare and initialize references at single step>
NOTIZ: Dieser Unterschied kann von Compiler zu Compiler variieren. Der obige Unterschied besteht in Bezug auf Turbo IDE.
3. Neuzuweisung: Ein Zeiger kann neu zugewiesen werden. Diese Eigenschaft ist nützlich für die Implementierung von Datenstrukturen wie einer verknüpften Liste, einem Baum usw. Siehe das folgende Beispiel:
int a = 5; int b = 6; int *p; p = &a; p = &b;>
4. Andererseits kann eine Referenz nicht erneut zugewiesen werden und muss bei der Initialisierung zugewiesen werden.
int a = 5; int b = 6; int &p = a; int &p = b; // This will throw an error of 'multiple declaration is not allowed' // However it is valid statement, int &q = p;>
5. Speicheradresse: Ein Zeiger hat seine eigene Speicheradresse und Größe auf dem Stapel, wohingegen eine Referenz dieselbe Speicheradresse wie die Originalvariable teilt und keinen Platz auf dem Stapel einnimmt.
int &p = a; cout << &p << endl << &a;>
6. NULL-Wert: Einem Zeiger kann direkt NULL zugewiesen werden, einer Referenz hingegen nicht. Die mit Referenzen verbundenen Einschränkungen (kein NULL, keine Neuzuweisung) stellen sicher, dass die zugrunde liegenden Operationen nicht in eine Ausnahmesituation geraten.
7. Indirekt: Sie können einen Zeiger auf einen Zeiger (sogenannter Doppelzeiger) haben, der zusätzliche Indirektionsebenen bietet, während Referenzen nur eine Indirektionsebene bieten. Zum Beispiel,
In Pointers, int a = 10; int *p; int **q; // It is valid. p = &a; q = &p; // Whereas in references, int &p = a; int &&q = p; // It is reference to reference, so it is an error>
8. Rechenoperationen: Auf Zeigern können verschiedene arithmetische Operationen ausgeführt werden, während es keine sogenannte Referenzarithmetik gibt (Sie können jedoch Zeigerarithmetik auf die Adresse eines Objekts ausführen, auf das eine Referenz zeigt, wie in &obj + 5).
Tabellarische Darstellung des Unterschieds zwischen Referenzen und Zeigern in C++
| Verweise | Hinweise | |
|---|---|---|
| Neuzuweisung | Die Variable kann in der Referenz nicht neu zugewiesen werden. | Die Variable kann in Zeigern neu zugewiesen werden. |
| Speicheradresse | Sie hat dieselbe Adresse wie die ursprüngliche Variable. | Zeiger haben ihre eigene Speicheradresse. |
| Arbeiten | Es bezieht sich auf eine andere Variable. | Es speichert die Adresse der Variablen. |
| Nullwert | Es hat keinen Nullwert. | Ihm kann der Wert Null zugewiesen werden. |
| Argumente | Auf diese Variable wird von der Methode „Wertübergabe“ verwiesen. | Der Zeiger funktioniert mit der Methode, die als Referenzübergabe bekannt ist. |
Wann was zu verwenden ist
Die Leistungen sind genau die gleichen, da Referenzen intern als Zeiger implementiert werden. Dennoch können Sie einige Punkte im Hinterkopf behalten, um zu entscheiden, wann Sie was verwenden:
- Verwenden Sie Referenzen:
- In Funktionsparametern und Rückgabetypen.
- Zeiger verwenden:
- Wenn eine Zeigerarithmetik oder die Übergabe eines NULL-Zeigers erforderlich ist. Zum Beispiel für Arrays (Beachten Sie, dass der Zugriff auf ein Array mithilfe der Zeigerarithmetik implementiert wird).
- Um Datenstrukturen wie eine verknüpfte Liste, einen Baum usw. und deren Algorithmen zu implementieren. Dies liegt daran, dass wir das Konzept der Zeiger verwenden müssen, um auf verschiedene Zellen zu zeigen.
Zitiert in C++ FAQ Lite : Verwenden Sie Referenzen, wenn Sie können, und Zeiger, wenn Sie müssen. Referenzen werden in der Regel Zeigern vorgezogen, wenn keine Neupositionierung erforderlich ist. Dies bedeutet normalerweise, dass Referenzen in der öffentlichen Schnittstelle einer Klasse am nützlichsten sind. Referenzen erscheinen normalerweise auf der Oberfläche eines Objekts und Zeiger im Inneren.
Die Ausnahme von oben besteht darin, dass der Parameter oder Rückgabewert einer Funktion eine Sentinel-Referenz benötigt – eine Referenz, die nicht auf ein Objekt verweist. Dies geschieht normalerweise am besten, indem man einen Zeiger zurückgibt/nimmt und dem nullptr-Wert diese besondere Bedeutung gibt (Referenzen müssen immer Alias-Objekte sein, kein dereferenzierter Nullzeiger).
Verwandter Artikel:
Wann übergeben wir Argumente als Referenz oder Zeiger?
Was ist Orakel?