cadena * y cadena & difieren en un par de formas. En primer lugar, el puntero apunta a la ubicación de la dirección de los datos. La referencia apunta a los datos. Si usted tuvo la siguiente función:
int foo(string *param1);
Usted tendría que comprobar en la declaración de función para asegurarse de que param1 señaló una ubicación válida. Comparativamente:
int foo(string ¶m1);
Aquí, es la responsabilidad del que llama asegurarse de que los datos apuntados son válidos. No puede pasar un valor "NULO", por ejemplo, int la segunda función anterior.
En cuanto a su segunda pregunta, sobre los valores de retorno método siendo una referencia, tenga en cuenta las siguientes tres funciones:
string &foo();
string *foo();
string foo();
En el primer caso, se estaría devolviendo una referencia a los datos. Si su declaración de la función era la siguiente:
string &foo()
{
string localString = "Hello!";
return localString;
}
Es probable que obtener algunos errores de compilación, ya que va a devolver una referencia a una cadena que fue inicializado en la pila para esa función. En el retorno de la función, esa ubicación de datos ya no es válida. Por lo general, le gustaría devolver una referencia a un miembro de la clase o algo así.
La segunda función anterior devuelve un puntero en la memoria real, por lo que se mantendría igual. Sin embargo, debería verificar los punteros NULL.
Finalmente, en el tercer caso, los datos devueltos se copiarán en el valor de retorno de la persona que llama. Así que si su función era la siguiente:
string foo()
{
string localString = "Hello!";
return localString;
}
Usted estaría bien, ya que la cadena "Hola" se copia en el valor de retorno para esa función, accesible en el espacio de memoria de la persona que llama.
Relacionado: http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and-reference-variable-in-c –
El operador '&' * hace lo mismo en C y C++ : toma la dirección de un objeto. El '&' en un prototipo de función no es un operador. Arreglaré el título. –