Toutes ces variantes sont identiques. Le langage C vous permet simplement d'utiliser d'autres orthographes, mais même la dernière variante explicitement annotée avec une taille de tableau se décompose en un pointeur normal.
En d'autres termes, même avec la dernière implémentation, il est possible d'appeler la fonction avec un tableau de tous taille :
void func3(char str[10]) { }
func("test"); // Works.
func("let's try something longer"); // Not a single f*ck given.
Il va sans dire que cela devrait no ne doit pas être utilisée : elle pourrait donner à l'utilisateur un faux sentiment de sécurité ("oh, cette fonction n'accepte qu'un tableau de longueur 10, je n'ai donc pas besoin de vérifier la longueur moi-même").
Comme l'a dit Henrik, la bonne méthode en C++ est d'utiliser std::string
, std::string&
o std::string const&
(selon que vous devez ou non modifier l'objet et que vous souhaitez ou non le copier).