2016-05-02 10 views
3

Während das Doppelzeigerkonzept zu verstehen und wo es verwendet werden sollte, habe ich einen Zweifel. Ich hatte diesen Code experimentiert und gefunden, dass ich den Zeiger anstelle der Doppelzeiger als Referenz verwenden konnte.Doppelter Zeiger gegen Durchgang durch Referenzzeiger

#include<iostream> 
using namespace std; 
void modify_by_value(int*); 
void modify_by_refrence(int* &); 
int a=4, b=5; 
void main() 
{ 

    int *ptr = NULL; 
    ptr = &a;  
    cout << "*ptr before modifying by value: " << *ptr << endl; 
    modify_by_value(ptr); 
    cout << "*ptr after modifying by value: " << *ptr << endl; 
    cout << "*ptr before modifying by refrence: " << *ptr << endl; 
    modify_by_refrence(ptr); 
    cout << "*ptr after modifying by refrence: " << *ptr << endl; 

} 
void modify_by_value(int* ptr)  //this function can change *ptr but not the ptr(address contained) itself; 
{ 
    ptr = &b;      
} 
void modify_by_refrence(int * &ptr) //this function has refrence and hence can modify the pointer; 
{ 
    ptr = &b; 
} 

Was den Vorteil der Verwendung von zwei Zeigern statt Referenz ist? Und wo dieses Ding sollte

+1

Sie sollten diejenige verwenden, die die Absicht des Codes deutlicher widerspiegelt. –

+0

@DavidSchwartz wenn die Absicht ist, den Wert eines Zeigers zu ändern, scheint es nicht offensichtlich, was zu wählen .. zumindest vermutlich nicht zu Omkar – xaxxon

+0

Wie aus den Antworten zu sehen, ist dies eine Frage "in erster Linie" und sollte sein geschlossen als solche. – xaxxon

Antwort

2

„Warum Referenz verwendet wird, um den Zeiger statt Zeiger auf Zeiger“ verwenden möchten, ? Sie erhalten die gleiche Antwort erhalten, als ob „warum mit Zeigern statt Referenz“ für jede andere Art von Variable fragen ...

Grundsätzlich gilt:

  • Referenzen (auf Zeiger oder jede andere Variable) sind intelligent weil es immer ein Ziel hinter

  • Zeiger sein sollte (auf Zeiger oder jede andere Variable) sind intelligent, weil sie möglicherweise NULL (optional) sein könnte

  • Referenzen (auf Zeiger oder ein ny andere Variable) nicht verfügbar in C

  • Referenzen (auf Zeiger oder jede andere Variable) intelligent sind, weil sie als Objekte (keine Notwendigkeit zu dereferenzieren wie Zeiger, einfachere Syntax verwendet werden kann, rading)

  • etc ...

Es gibt viele Stellen der Beantwortung dieser Frage bereits:

What are the differences between a pointer variable and a reference variable in C++?

Are there benefits of passing by pointer over passing by reference in C++?

0

Die verwendet werden Idiom „Zeiger auf den Zeiger“ geht zurück auf C, wo es notwendig war. C hatte keine Referenzen. Sie haben recht, wenn Sie vermuten, dass es in C++ nicht benötigt wird.

(A "double-Zeiger" beziehen könnte auch auf double*, BTW, pointer-to-Zeiger nicht so eindeutig ist)

+0

Wie würden Sie die Adresse eines Zeigers an eine Funktion übergeben, die ohne einen Doppelzeiger möglicherweise nullptr sein könnte? Oder wenn Sie den Wert eines Doppelzeigers ändern möchten, dem Sie ein Array einzelner Zeiger zugewiesen haben, auf die er zeigen soll. – xaxxon

+0

@xaxxon: 'optional '; komm C++ 17 das wird 'std :: optional ' sein. Kann nicht mit 'T * &' verwechselt werden – MSalters

1

In diesem Fall ist der Doppelzeiger Idiom ist eine C Vererbung. C hatte kein Konzept von Verweisen (und hat immer noch keinen), daher bestand die einzige Möglichkeit, einen Zeiger zu ändern, darin, einen Zeiger an den Zeiger zu übergeben.

Aber wie C++ Referenzen bietet, sollten Sie sie verwenden, wenn Sie nur eine Variable in einer Funktion ändern müssen, sei es ein Zeiger oder nicht, da es Code über Programmierer Absichten klarer zu sein.

Die Ausnahme obige Regel zu sein, wenn, wenn Sie den Nullwert als Spezialfall (eine Referenz kann nie Punkt auf null)

-1

Es gibt keine Vorteile von einem über den anderen. Beide erfüllen genau die gleichen Bedürfnisse. Am Ende kommt es also auf die Präferenz an.

Einige argumentieren, dass Verweis auf Zeiger sicherer als Zeiger auf Zeiger ist.

Verwandte Themen