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
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:
Siehe diese verwandte Frage für weitere Unterschiede:
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:
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.
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.
Tags und Links c++