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.