2009-10-30 18 views
6

¿Cuál es la diferencia entre pasar por referencia y usar la notación del puntero C?Diferencia entre pass-by-reference & y *?

void some_function(some_type& param)

y

void some_function(some_type *param)

Gracias

+4

Dudo que alguien vaya a reproducir uno de los 1000 tutoriales y explicaciones que ya existen aquí. Eche un vistazo a: http://www.parashift.com/c++-faq-lite/references.html – pmr

+0

posible engaño: http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and -reference-variable-in-c – Jherico

+0

duplicado: http://stackoverflow.com/questions/1322517/passing-a-modifiable-parameter-toc-c-function – SadSido

Respuesta

7

Cuando pasa un puntero a una variable en una llamada de subrutina, la dirección de esa variable se pasa a la subrutina. Para acceder a la variable en la subrutina, el puntero debe ser desreferenciado.

Cuando pasa una referencia a una variable, el compilador se ocupa de obtener la dirección de la variable cuando la variable se pasa a la subrutina y desreferenciar la variable en la subrutina.

+0

¡Maravilloso! Esto ayuda mucho! –

+0

Definitivamente NO es un azúcar sintáctico. Hay diferencias, como puede ver en las otras respuestas. – SadSido

+0

Hay muchas diferencias sutiles entre las dos ya que una referencia es un alias. Vea abajo. –

6
  • No se puede obtener una referencia NULL: esto solo te da mucha seguridad
  • se puede tratar a su referencia como si fuera un objeto: puedes desreferenciarlo o lo que necesites.

Básicamente maneja un puntero seguro como si fuera su propio objeto.

+6

puede obtener fácilmente una referencia nula desreferenciando un puntero nulo. – Jherico

+0

¿Eso es defensivo o paranoico? –

+0

Generalmente es más un error: sus puntos de referencia para un objeto que ha sido destruido o que nunca ha existido. Ejemplo infame: 'std :: vector myVec; myVec.front(); '... cómo te arrepientes entonces, ese' std :: vector :: front' no tira out_of_range! –