Con:
addNode(node *&head, int value)
... el tipo de head
es "referencia a puntero a -nodo".
Con:
addNode(node **head, int value)
... el tipo es "puntero a puntero a nodo".
Un puntero y una referencia son no lo mismo. Una forma simple de pensar en una referencia es como un apuntador sin referencias.
Usted tendría sintaxis diferente para llamar a las dos versiones:
node* my_node = 0;
addNode(my_node, 0); // syntax for first version
addNode(&my_node, 0); // syntax for 2nd version
Existen diferencias semánticas también. Cuando pasa un puntero, puede pasar NULL. Cuando pasas una referencia, no puedes.Esta es una función que toma un ref-a-ptr confunde el asunto un poco, por lo que vamos a cambiar el problema un poco:
void make_string(string& str_ref)
{
str_ref = "my str";
}
void make_string_again(string* str_ptr)
{
*str_ptr = "my other string";
}
Estos dos finctions hacen lo mismo, pero se toma una referencia string
mientras que el otro toma un puntero string
. Si se va a hacer esto:
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
se puede ver que se hace difícil (pero no imposible) para llamar make_string
con un puntero nulo. Esto podría ayudarlo a implementar mejores funciones en caso de que espere que make_string
se nunca se llame a con un objeto no válido.
Al menos de acuerdo con el artículo que encontré, es un puntero a una referencia y no al revés. (No estaba seguro de cuál era yo, así que realmente no estoy seguro). La diferencia puede ser muy sutil, pero podría causar cierta confusión en casos raros. –
No puede tener un puntero a una referencia (esa es otra diferencia entre punteros y referencias por cierto, y también se menciona en la página a la que he vinculado). Vea también esta pregunta: http://stackoverflow.com/questions/1898524/difference-between-pointer-to-a-reference-and-reference-to-a-pointer –
Buen punto. No lo pensé lo suficiente. Solo estaba tratando de pensar en términos de vinculación del operador. –