56 votes

Différence entre le passage d'un tableau, d'un tableau de taille fixe et de l'adresse de base d'un tableau en tant que paramètre d'une fonction

Je ne sais pas quelle syntaxe utiliser si je veux passer un tableau de taille connue ou inconnue comme paramètre d'une fonction.

Supposons que je dispose de ces variantes à cette fin :

void func1(char* str) {
    //print str
}

void func2(char str[]) {
    //print str
}

void func3(char str[10]) {
    //print str
}

Quels sont les avantages et les inconvénients de l'utilisation de chacun d'entre eux ?

74voto

Konrad Rudolph Points 231505

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).

20voto

Morwenn Points 4071

Notez qu'en C++, si la longueur du tableau est connue au moment de la compilation (par exemple si vous avez passé une chaîne littérale), vous pouvez obtenir sa taille :

template<unsigned int N>
void func(const char(&str)[N])
{
    // Whatever...
}

int main()
{
    func("test"); // Works, N is 5
}

12voto

Henrik Points 16565

En C++, utilisez void func4(const std::string& str) .

1voto

Rüppell's Vulture Points 1985

En C, les deux premières définitions sont équivalentes. La troisième est essentiellement la même, mais elle donne une idée de la taille du tableau.

Si l'impression str est votre intention, alors vous pouvez utiliser n'importe laquelle d'entre elles en toute sécurité.Essentiellement, les trois fonctions se voient passer un paramètre de type char* Juste ce qu'il faut printf() doit imprimer une chaîne de caractères. Et, au cas où vous ne le sauriez pas, malgré ce que l'on pourrait croire, tous les passages de paramètres en C se font en pass-by-value mode.

Editer : Il semble que je doive dorénavant être très rigoureux dans le choix de mes mots sur SO.Bien, dans le troisième cas, il ne donne aucune idée de la taille du tableau à la fonction à laquelle elle est transmise car elle est finalement réduite au type char* Je voulais dire que cela indique en quelque sorte à l'humain qui le lit que la taille du tableau est de 10. De plus, ce n'est pas faux/illégal en C. Mais pour le programme, c'est aussi bien qu'inutile. Cela ne donne aucune idée de la taille du tableau à la fonction à laquelle il est passé. M. Downvoter, merci de souligner que l'attitude désinvolte et la négligence ne sont pas tolérées sur SO.

1voto

user2301717 Points 36

Dans un tableau à une dimension, ils sont tous traités de la même manière par le compilateur. Cependant, pour un tableau à deux dimensions ou plus, (par exemple myArray[10][10] ), il est utile car il permet de déterminer la longueur des lignes et des colonnes d'un tableau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X