21 Stimmen

C++ Unterschied zwischen ** und *& bei der Parameterübergabe

Ich habe Operationen auf einer Liste implementiert, einer von ihnen ist hinzufügen, und da ich nicht etwas zurückgeben möchten, las ich, dass ich ** verwenden musste, und es funktioniert, aber ich sah an anderer Stelle, dass es als * & übergeben wird, aber ich weiß nicht, den Unterschied

addNode( node *&head, int value) addNode(node **head, int value)

Worin besteht der Unterschied, und welche ist besser, oder bedeuten sie dasselbe? Ich weiß, dass das zweite ein Zeiger auf einen Zeiger ist.

Danke

30voto

Mark Byers Punkte 761508

Die erste ( ** ) ist eine Zeiger auf einen Zeiger und die zweite ( *& ) ist eine Referenz auf einen Zeiger.

Ein Verweis und ein Zeiger sind konzeptionell sehr ähnlich. Aber es gibt einige wichtige Unterschiede, zum Beispiel:

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

Weitere Unterschiede finden Sie in dieser verwandten Frage:

0 Stimmen

Zumindest laut dem Artikel, den ich gefunden habe, ist es ein Zeiger auf eine Referenz und nicht umgekehrt. (Ich war mir selbst nicht sicher, was es war, also weiß ich es nicht genau.) Der Unterschied ist zwar sehr subtil, könnte aber in seltenen Fällen zu Verwirrung führen.

3 Stimmen

Man kann keinen Zeiger auf einen Verweis haben (das ist übrigens ein weiterer Unterschied zwischen Zeigern und Verweisen und wird auch auf der Seite erwähnt, auf die ich verlinkt habe). Siehe auch diese Frage: stackoverflow.com/questions/1898524/

0 Stimmen

Gutes Argument. Ich habe das nicht genau genug durchdacht. Ich habe nur versucht, es im Sinne der Betreiberbindung zu sehen.

7voto

John Dibling Punkte 96619

Mit:

addNode( node *&head, int value)

...die Art der head ist "Verweis auf Zeiger-auf-Knoten".

Mit:

addNode(node **head, int value)

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

Ein Zeiger und ein Verweis sind no die gleiche Sache. Eine einfache Möglichkeit, sich eine Referenz vorzustellen, ist eine dereferenzierter Zeiger .

Um beide Versionen aufzurufen, ist eine unterschiedliche Syntax erforderlich:

node* my_node = 0;
addNode(my_node, 0);  // syntax for first version
addNode(&my_node, 0); // syntax for 2nd version

Es gibt auch semantische Unterschiede. Wenn Sie einen Zeiger übergeben, können Sie NULL übergeben. Bei der Übergabe einer Referenz ist das nicht möglich. Da es sich hier um eine Funktion handelt, die einen ref-to-ptr nimmt, ist die Sache etwas verwirrend, also ändern wir das Problem ein wenig:

void make_string(string& str_ref)
{
  str_ref = "my str";
}

void make_string_again(string* str_ptr)
{
  *str_ptr = "my other string";
}

Diese beiden Finktionen bewirken das Gleiche, aber eine nimmt eine string Referenz, während die andere eine string Zeiger. Wenn Sie dies tun würden:

string str;
make_string(str); // OK
make_string_again(&str); // OK - &str is a pointer to a real string
make_string_again(0); // Not OK - compiles but will crash when function dereferences the null pointer

Wie Sie sehen, wird es schwierig (aber nicht unmöglich), die make_string mit einem Null-Zeiger. Dies könnte Ihnen helfen, bessere Funktionen für den Fall zu implementieren, dass Sie erwarten, dass make_string sera niemals mit einem ungültigen Objekt aufgerufen werden.

1voto

Bill Lynch Punkte 76551

Dies ist der Unterschied zwischen nach Wert übergehen y als Referenz übergeben . Übergabe durch Referenz, im Grunde tut implizit die Referenz und Dereferenz, dass die doppelte Zeiger erhalten Sie.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X