Les chaînes de caractères * et les chaînes de caractères& diffèrent à plusieurs égards. Tout d'abord, le pointeur pointe vers l'adresse de la donnée. La référence pointe vers les données. Si vous aviez la fonction suivante :
int foo(string *param1);
Vous devriez vérifier dans la déclaration de la fonction que param1 pointe vers un emplacement valide. Comparativement :
int foo(string ¶m1);
Ici, il incombe à l'appelant de s'assurer que les données pointées sont valides. Vous ne pouvez pas passer une valeur "NULL", par exemple, dans la deuxième fonction ci-dessus.
En ce qui concerne votre deuxième question, à savoir que les valeurs de retour des méthodes constituent une référence, considérez les trois fonctions suivantes :
string &foo();
string *foo();
string foo();
Dans le premier cas, vous renverriez une référence aux données. Si votre déclaration de fonction ressemble à ceci :
string &foo()
{
string localString = "Hello!";
return localString;
}
Vous obtiendrez probablement des erreurs de compilation, puisque vous retournez une référence à une chaîne de caractères qui a été initialisée dans la pile pour cette fonction. Au retour de la fonction, cet emplacement de données n'est plus valide. Typiquement, vous voudriez retourner une référence à un membre de classe ou quelque chose comme ça.
La deuxième fonction ci-dessus renvoie un pointeur dans la mémoire actuelle, qui reste donc inchangé. Vous devrez cependant vérifier les pointeurs NULL.
Enfin, dans le troisième cas, les données renvoyées sont copiées dans la valeur de retour pour l'appelant. Donc si votre fonction était comme ceci :
string foo()
{
string localString = "Hello!";
return localString;
}
Tout irait bien, puisque la chaîne "Hello" serait copiée dans la valeur de retour de cette fonction, accessible dans l'espace mémoire de l'appelant.