C ++ Unterschied zwischen ** und * & in Parameterübergabe

8

Ich habe Operationen auf einer Liste implementiert, eine von ihnen ist add, und da ich nichts zurückgeben will, habe ich gelesen, dass ich ** benutzen musste, und es funktioniert, aber ich sah an einem anderen Ort, dass es wird als * & amp; übergeben, aber ich kenne den Unterschied nicht

addNode (Knoten * & amp; head, int-Wert) addNode (Knoten ** Kopf, int-Wert)

Was ist der Unterschied, welcher ist besser, oder meinen sie das Gleiche? Ich weiß, dass der zweite Zeiger auf einen Zeiger ist.

Danke

    
bb2 30.09.2010, 19:21
quelle

3 Antworten

13

Der erste ( ** ) ist ein Zeiger für einen Zeiger und der zweite ( *& ) ist ein Verweis für einen Zeiger.

Eine Referenz und ein Zeiger sind konzeptionell ziemlich ähnlich. Aber es gibt einige wichtige Unterschiede, zum Beispiel:

  • Ein Verweis kann nicht NULL sein (aber er kann sich auf einen Zeiger beziehen, der auf NULL zeigt).
  • Sie können eine Referenz nicht ändern, um auf etwas anderes zu verweisen.
  • Sie müssen einen Zeiger dereferenzieren, um auf den Wert zuzugreifen.

Siehe diese verwandte Frage für weitere Unterschiede:

Mark Byers 30.09.2010 19:26
quelle
4

Mit:

%Vor%

... der Typ von head ist "Verweis auf Zeiger zu Knoten".

Mit:

%Vor%

... der Typ ist "Zeiger-zu-Zeiger-zu-Knoten".

Ein Zeiger und eine Referenz sind nicht dasselbe. Eine einfache Möglichkeit, sich eine Referenz vorzustellen, ist ein dereferenzierter Zeiger .

Sie müssten eine andere Syntax verwenden, um beide Versionen aufzurufen:

%Vor%

Es gibt auch semantische Unterschiede. Wenn Sie einen Zeiger übergeben, können Sie NULL übergeben. Wenn Sie eine Referenz übergeben, können Sie nicht. Da es sich um eine Funktion handelt, die ein ref-to-ptr akzeptiert, verwirren Sie die Sache ein wenig, also lassen Sie uns das Problem etwas ändern:

%Vor%

Diese beiden Funktionen machen dasselbe, aber einer nimmt eine string Referenz, während die andere einen string Zeiger verwendet. Wenn Sie das tun würden:

%Vor%

Sie können sehen, dass es schwierig (aber nicht unmöglich) ist, make_string mit einem Nullzeiger aufzurufen. Dies könnte Ihnen helfen, bessere Funktionen zu implementieren, wenn Sie erwarten, dass make_string nie mit einem ungültigen Objekt aufgerufen wird.

    
John Dibling 30.09.2010 19:33
quelle
1

Dies ist der Unterschied zwischen nach Wert weitergeben und durch Verweis gehen . Referenzieren führt implizit implizit die Referenz und Dereferenzierung durch, die der Doppelzeiger erhält.

    
Bill Lynch 30.09.2010 19:26
quelle

Tags und Links