2010-09-30 53 views
8

He implementado operaciones en una lista, una de ellas es agregar, y como no deseo devolver nada, leí que tenía que usar **, y funciona, pero he visto en otro lugar que se pasa como * &, pero no sé la diferenciaC++ diferencia entre ** y * & en el parámetro que pasa

addNode (nodo * & cabeza, int value) addNode (nodo ** cabeza, int value)

¿Cuál es la diferencia, y cuál es mejor, o significan lo mismo? Sé que el segundo es un puntero a un puntero.

Gracias

Respuesta

1

Esta es la diferencia entre pass by value y pass by reference. Pase por referencia; básicamente, implícitamente hace la referencia y la desreferencia que le proporciona el doble puntero.

13

El primero (**) es un puntero a un puntero y la segunda (*&) es una referencia a un puntero.

Una referencia y un puntero son conceptualmente bastante similares. Pero hay algunas diferencias importantes, por ejemplo:

  • Una referencia no puede ser NULL (pero puede referirse a un puntero que apunta a NULL).
  • No puede modificar una referencia para hacer referencia a otra cosa.
  • Necesita desreferenciar un puntero para acceder al valor.

Ver esta pregunta relacionada para más diferencias:

+0

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. –

+2

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 –

+0

Buen punto. No lo pensé lo suficiente. Solo estaba tratando de pensar en términos de vinculación del operador. –

4

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.

Cuestiones relacionadas