Façons de représenter une fonction avec des parameters de tableau multidimensionnel

J’apprends actuellement une fonction qui fonctionne avec un tableau multi-dimensionnel en C.

Disons que j’ai

short myArray[10][30]. 

J’ai déclaré que le prototype de fonction suivant fonctionnait avec myArray .

 void first(int n, short ar[][30]); void second(int n, short ar[30]); void third(int n, short (*ar)[30]); 

D’après ce que j’ai compris, les parameters ar de la first et de la third fonction sont équivalents. short ar[][30] dans la first fonction est équivalent au short (*ar)[30] dans la third fonction car ils sont tous deux un pointeur sur un array of 30 short .

La second fonction de ar est différente car, en short ar[30] , ar est un pointer to short et non sur un array of 30 short .

Ma compréhension est-elle correcte?

Oui, votre compréhension est correcte. 1 et 3 sont équivalents. Et 2 est également bon (mais pas pour passer tableau 2d – il est correct pour passer tableau 1D). Mais clarifiera un peu le second cas.

Et le second que 30 à l’intérieur des troisièmes crochets ne sont pas pris en compte par le compilateur. Vous pouvez l’omettre mais le compilateur ne se plaindra pas. En fait ici, vous avez passé un tableau 1D de short qui se décomposait en pointeur vers le premier élément (le premier élément étant short il est short* ). Donc, le second, vous pouvez aussi écrire aussi short *ar .

 void second(int n, short ar[]); void second(int n, short* ar ); 

Ces deux œuvres et elles sont équivalentes dans ce contexte. Le second sert à transmettre un tableau 1D comme

  second(n, myArray[5]); 

Le problème, c’est que la plupart du temps, le tableau se désintègre en pointeur (exception est l’opérateur sizeof ou Alignof etc.). Passer un tableau à une fonction est un cas où le tableau se désintègre.

De plus, vous passez des tableaux int , il est donc erroné d’écrire short ( int et short peuvent avoir la même taille mais il est garanti que la taille de int sera supérieure ou égale à la taille de short ). Si vous avez utilisé short puis écrit int dans la déclaration, cela aurait fonctionné.

Edit : Le second ne sert pas à passer un tableau 2D. Soyons clairs là-dessus. Vous ne pouvez pas transmettre le tableau 2d à une fonction dont le prototype est déclaré deuxième. Pour les pointeurs, il y a 2 choses à considérer: le type et la valeur. Si vous tentiez de transmettre un tableau 2D à la même fonction, cela serait illégal. La masortingce 2D se désintègre en int (*)[30] qui n’est en aucun cas identique à int * ou int[] .

1 et 3 sont en effet les mêmes, ce qui serait

 void fourth(int n, short ar[10][30]); 

Parce que lorsque vous passez un tableau en tant que paramètre de fonction, il se décompose en un pointeur vers son premier paramètre. Le compilateur voit donc 1 et 4 comme 3.

Cela explique pourquoi cela serait également correct:

 void fifth(int n, short arr[15][30]); 

Lorsqu’elle se décompose en un pointeur, la taille déclarée de la première dimension n’est pas utilisée. Vous êtes censé donner la taille réelle d’une autre manière.

Mais celui-ci est différent:

 void second(int n, short ar[30]); 

et votre compilateur devrait émettre un avertissement car le paramètre attendu est un pointeur sur short , lorsque vous passez un pointeur sur un tableau de 30 short . Bien sûr, les pointeurs auront la même valeur (même adresse) et les compilateurs courants donneront les résultats attendus, mais la norme ne permet pas de créer un alias de pointeur vers tableau et un pointeur vers élément. Alors s’il vous plaît évitez-le.

Avec une telle déclaration, second devrait être appelé comme

 cr = second(n, arr[0]); 

car arr[0] est un tableau court et se décompose correctement en un short * .