Zeiger vs. Referenzen in C++

Zeiger vs. Referenzen in C++

In C++ werden Zeiger und Referenz verwendet, um indirekt auf das Objekt zuzugreifen. Daher ist es wichtig zu wissen, wann der Zeiger und wann die Referenz verwendet wird. Dieser Artikel erklärt den Unterschied zwischen Zeiger und Referenz (Zeiger vs. Referenzen) in C++. Hier werde ich einige wichtige Unterschiede zwischen der Referenz und dem Zeiger besprechen, die Ihnen bei der Entscheidung helfen, wann Sie die Referenz und wann den Zeiger verwenden. Außerdem werde ich einige Codeschnipsel verwenden, die Ihnen helfen zu verstehen, warum sich Verweise und Zeiger voneinander unterscheiden.

Sie können auch den unten erwähnten Artikel lesen
  • Referenzen in C++, die Sie kennen sollten.
  • Referenz und Konstante in C++.
  • Kurze Einführung des Zeigers.
  • Unterschied zwischen konstanter Referenz und Referenz in einem Parameter.

Zeiger vs. Referenzen in C++:

Wenn wir einige Punkte weggelassen haben, ähneln die Referenzen den Zeigern. Nachfolgend habe ich einige Punkte ausgewählt, die Zeiger und Referenz in C++ unterscheiden (Zeiger vs. Referenzen):

1. Deklaration und Initialisierung:

Der syntaktische Aufbau der Referenzdeklaration ähnelt der Zeigerdeklaration. Der Unterschied besteht darin, dass eine Zeigerdeklaration den * verwendet -Operator verwendet eine Referenzdeklaration den & Operator. Es bedeutet Zeigername gefolgt von * (Sternchen ), aber der Referenzname, gefolgt von & (Adresse des Betreibers).

Beispiel

//create an variable
int data = 6;



//rData (reference) refer to data
int& rData = data;



//pData (pointer) refer to data
int *pData = &data;

     OR
     
int *pData;
pData = &data;

2. Initialisierung mit NULL-Zeiger:

Ein Zeiger kann auf den Nullzeiger zeigen, aber eine Referenz kann nicht auf NULL verweisen.

//reference refer to null
int& rData = NULL; //error



//pointer point to null
int *pData = NULL; // ok

3. Neubindung:

Sie sollten daran denken, dass eine Referenz, die einmal mit einem beliebigen Objekt verbunden wurde, nicht erneut mit einem anderen Objekt verbunden wird. Aber es gilt nicht für Zeiger, wir können Zeiger gemäß den Anforderungen mehrmals initialisieren, und es ist nicht erforderlich, die Zeiger zum Zeitpunkt der Erstellung zu initialisieren.

/****reference****/
int& rData;  //error

int& rData = a; //ok, rData (reference) refer to 'a' 

rData = b; //error



/****Pointer****/
int *pData; // ok

int *pData = &a; // ok, pData point to 'a' 

pData = &b; // ok, pData point to 'b'

4. Zugriff auf den Wert:

Eine Referenz kann als Name eines Objekts betrachtet werden. Wir brauchen also keinen zusätzlichen Operator beim Zugriff auf den Wert. Aber bei Zeigern brauchen wir den Indirektionsoperator beim Zugriff auf den Wert. Sehen wir uns zum besseren Verständnis einen Beispielcode an,

#include <iostream>
using namespace std;

int main()
{
    //create an variable
    int data = 6;

    //pointer point to data
    int *pData = &data;

    //rOffData refer to data
    int& rData = data;


    cout << "Value of data, rData and pData" << endl;

    cout << "data = " << data << endl;

    //accessing value by reference
    cout << "rData = " << rData << endl;

    //accessing value by pointer
    cout << "*pData = " << *pData << endl;

    return 0;
}

Ausgabe:

Value of data, rData and pData
data1 = 6
rData = 6
*pData = 6

 Wenn Sie eine Programmiersprache online lernen möchten, können Sie sich die Kurse ansehen, eine kostenlose Testversion ist verfügbar.

Klicken Sie hier, um Ihre kostenlose Testversion zu erhalten

5. dynamic_cast fehlgeschlagen:

Ein fehlgeschlagener dynamic_cast hat nicht die gleiche Wirkung auf einen Zeiger und eine Referenz:

1. Ein fehlgeschlagener dynamic_cast auf einen Zeiger gibt einen Nullzeiger zurück.
2. Ein fehlgeschlagener dynamic_cast für eine Referenz löst eine Ausnahme vom Typ std::bad_cast aus. Dies ist sinnvoll, da es keine Nullreferenz zurückgeben kann.

6. Speicher:

es ist nicht spezifiziert, ob eine Referenz gespeichert werden muss oder nicht. Trotzdem habe ich einige Beispiele gesehen, bei denen eine Referenz dieselbe Speicheradresse wie die ursprüngliche Variable teilt, aber auch etwas Platz auf dem Stapel beansprucht. Sehen wir uns einen Beispielcode an,

void fun(int& rChangeData)
{
    rChangeData = 10;
}


int main()
{
    int data = 5;

    int& rData = data;

    fun(rData);

    return 0;
}

Im obigen Code sollte rData keinen Platz auf dem Hauptstapel einnehmen, aber die Referenz rChangeData der Funktion nimmt einen Platz auf seinem Stapel ein. Das bedeutet, wenn die Funktion „fun“ mit rData als Argument aufgerufen wird, wird die Adresse der Daten auf den Stack der Funktionen geschoben.

7. Sicherheit:

Referenzen sind ziemlich sicherer als Zeiger; Das ist der Grund, warum C++-Leute darauf bestehen, Referenzen in der C++-Programmierung zu verwenden. Aber es liegt an Ihnen und Ihren Anforderungen.

Zeiger sind leistungsfähiger als Referenzen, da sie eine erneute Bindung und Nullzulässigkeit zulassen. Auch wenn Sie „Spider-Man-Film“ gesehen haben , dann wissen Sie, dass „große Macht mit großer Verantwortung einhergeht“, also müssen Sie sich immer Sorgen machen, dass ein Zeiger nicht null ist und sein spitzes Ziel nicht ändert.

Aber es ist auch nicht 100% wahr, dass eine Referenz immer sicher ist, Sie müssen auch vorsichtig sein, bevor Sie eine Referenz verwenden.

Sehen wir uns ein Beispiel an, bei dem die Referenz ungültig ist und undefiniertes Verhalten verursachen kann, und das Schlimme ist, dass es schwierig wäre, ein solches Problem zu verfolgen.

int* pData;


int& rData = *pData;

Einige andere Unterschiede zwischen Referenzen und Zeigern:

1. Es dürfen keine Verweise auf Verweise, aber Zeiger auf Zeiger möglich sein.

2. Es sollen keine Arrays von Referenzen, sondern ein Array von Zeigern möglich sein.

3. Es sollen keine Zeiger auf Referenzen, aber Zeiger auf Zeiger möglich sein.

Empfohlener Beitrag

  • C-Programmierkurse und Tutorials.
  • CPP-Programmierkurse und Tutorials.
  • Python-Kurse und Tutorials.
  • Einführung der Referenz in C++.
  • Alles über den neuen Operator.
  • C++ MCQ für Sie.
  • C++-Interviewfragen mit Antworten.
  • Konstruktoren in C++.
  • Beste Maus für den Programmierer.
  • Erstaunliche Liste von Geschenken für Programmierer, Sie müssen.
  • Beste Elektronik-Kits für Programmierer.
  • 100 C Interviewfragen.
  • C#-Interviewfragen mit Antworten.