web-dev-qa-db-fra.com

Passer une chaîne à une fonction en C - avec ou sans pointeurs?

Quand je passe une chaîne à la fonction, parfois, j'utilise

char *functionname(char *string name[256])

et parfois je l'utilise sans pointeurs (par exemple:

char functionname(char string[256])

Ma question est la suivante: quand dois-je utiliser des pointeurs? J'écris souvent des programmes sans pointeur et cela fonctionne, mais parfois ce n'est pas le cas. 

19
Zen Cicevic

La convention acceptée de passer des C-strings à des fonctions est d'utiliser un pointeur:

void function(char* name)

Lorsque la fonction modifie la chaîne, vous devez également indiquer la longueur:

void function(char* name, size_t name_length)

Votre premier exemple: 

char *functionname(char *string name[256])

passe un tableau de pointeurs sur des chaînes qui n’est pas ce dont vous avez besoin.

Votre deuxième exemple:

char functionname(char string[256])

passe un tableau de caractères. La taille du tableau ici n'a pas d'importance et le paramètre va décroître en un pointeur de toute façon, c'est donc équivalent à:

char functionname(char *string)

Voir aussi cette question pour plus de détails sur les arguments de tableau en C.

33
Adam Zalcman

En supposant que vous vouliez écrire

char *functionname(char *string[256])

Ici, vous déclarez une fonction qui prend un tableau de 256 pointeurs vers char en argument et renvoie un pointeur sur char. Ici, d'autre part,

char functionname(char string[256])

Vous déclarez une fonction qui prend un tableau de 256 chars en argument et renvoie char.

En d'autres termes, la première fonction prend un tableau de chaînes et renvoie une chaîne, tandis que la seconde utilise une chaîne et renvoie un caractère.

1
Nicola Musatti

Un tableau est un pointeur. Il pointe vers le début d'une séquence "d'objets".

Si nous faisons cela: ìnt arr[10];, alors arr est un pointeur sur un emplacement mémoire, à partir duquel dix entiers suivent. Ils ne sont pas initialisés, mais la mémoire est allouée. C'est exactement la même chose que de faire int *arr = new int[10];.

0
Anickyan