Una diferencia, como se ha mencionado anteriormente, es que no puede pasar una referencia nula, pero puede pasar un puntero nulo.
Otra cosa, también ya se ha mencionado, cuando se llama f(a,b)
podría haber confusión si la persona que llama no sabe que f
podría potencialmente cambiar el valor de b
Sin embargo, otro problema, que es bastante sutil, pero I still ran into it, es la semántica de las referencias.
Los indicadores se transmiten por su valor, pero las referencias no lo son.
Lo que significa que, si pasa un parámetro por un puntero, puede cambiar el puntero y hacer que apunte a otra cosa.
Considera:
void f1_ptr(type * a)
{
a = new type(); //no change to passed parameters, you're changing the pointer which was passed by value
}
void f2_ptr(type * a)
{
*a = some_other_value; //now you're changing the value of the parameter that was passed
//or, if type is a class or struct:
a->some_method_that_modifies_object(); //again, changing the parameter that was passed
}
Pero, al pasar por referencia, no se puede cambiar la referencia para referirse a otro valor. Una vez que se establece la referencia, no se puede cambiar.
void f3_ref(type& a)
{
a = type(); //the referred variable has also changed
}
//....
type obj = type(params);
f3_ref(obj); //obj now changed
f1_ptr(&obj); //obj doesn't change
f2_ptr(&obj); //obj now changed
Hay una gran cantidad de artículos y temas acerca de este tema http://www.google.ru/search?q=pointer+vs+ referencia – abatishchev