Passer le tableau C en tant que paramètre de fonction char *

J’ai du code que je maintiens avec la déclaration de variable suivante:

char tmpry[40]; 

Il est utilisé avec cette fonction:

 char *SomeFunction(char *tmpryP) { // Do stuff. } 

L’appel de fonction est:

 SomeFunction(&tmpry[0]); 

Je suis vraiment sûr que c’est la même chose que:

 SomeFunction(tmpry); 

J’ai même vérifié que le pointeur char * de SomeFunction finissait par pointer vers le même emplacement mémoire que le tableau dans les deux cas.

Ma question est une vérification de la santé mentale de savoir si les deux appels de fonction sont identiques (et donc le programmeur d’origine était juste méchant)?

ils sont exactement les mêmes.

 someArray[i] 

signifie exactement

 *(someArray + i) 

où someArray dans le second cas est un pointeur sur l’emplacement de la mémoire. De même,

 &someArray[i] 

signifie exactement

 (someArray + i) 

Dans les deux cas, les termes sont des pointeurs vers des emplacements de mémoire.

Les deux sont équivalents et je pense SomeFunction (tmpry); est plus lisible.

Cela peut être significatif si SomeFunction est une macro et prend "sizeof" de l’un de ses arguments, car sizeof(tmpry) ne sera pas nécessairement égal à sizeof(&tmpry[0]) .

Autrement, comme d’autres l’ont souligné, ils sont exactement les mêmes.

La section FAQ sur la programmation en C sur les tableaux et les pointeurs aborde ce problème (ainsi que de nombreuses autres questions et confusions courantes en C).

Comme tout le monde l’a dit, les deux notations sont équivalentes.

J’utiliserais normalement le plus simple, à moins qu’il y ait plusieurs appels comme celui-ci:

 SomeFunction(&tmparry[0]); SomeFunction(&tmparry[10]); SomeFunction(&tmparry[NNN]); 

Où idéalement toutes les constantes (nombres magiques) seraient des constantes enum (ou #define ).

Les deux ne font qu’un, bien que le second soit joli et clarifie l’intention de passer le tableau à la fonction. Mais comment la SomeFunction connaît-elle la taille du tableau transmis, est-il toujours supposé être 40? Je pense qu’il est préférable de passer la taille également comme paramètre à SomeFunction.

Ces deux variantes sont équivalentes et passent comme ça

 SomeFunction(tmpry); 

semble plus propre.

La déclaration

int a [10]; int * pa;

Il y a une différence entre un tableau et un pointeur qu’il faut garder à l’esprit. Un pointeur est une variable, donc pa = a et pa ++ sont légaux. Mais un nom de tableau n’est pas une variable. la construction comme a = pa et a ++ est illégale

En tant que parameters de format dans une définition de fonction, chars [] et char * s sont équivalents;

De: Le langage de programmation C 2ème , pages 99-100