Quel est le type de pointeur d’un tableau multidimensionnel lorsqu’il est transmis à une fonction?

J’apprends le C et les pointeurs dans ma classe universitaire et je pense que je comprends assez bien le concept, à l’exception de la similitude entre les tableaux multidimensionnels et les pointeurs.

Je pensais que puisque tous les tableaux (même multidimensionnels) sont stockés en mémoire continue, vous pouvez le convertir en toute sécurité en un int* (en supposant que le tableau donné est un int[] .) Cependant, mon professeur a dit que le nombre d’écanvass dans le la définition dépend du nombre de dimensions dans le tableau. Ainsi, un int[] deviendrait un int* , un int[][] deviendrait un int** , etc.

J’ai donc écrit un petit programme pour tester ceci:

 void foo(int** ptr) { } void bar(int* ptr) { } int main() { int arr[3][4]; foo(arr); bar(arr); } 

À ma grande surprise, le compilateur a émis des avertissements sur les deux appels de fonction.

 main.c:22:9: warning: incompatible pointer types passing 'int [3][4]' to parameter of type 'int **' [-Wincompatible-pointer-types] foo(arr); ^~~ main.c:8:16: note: passing argument to parameter 'ptr' here void foo(int** ptr) ^ main.c:23:9: warning: incompatible pointer types passing 'int [3][4]' to parameter of type 'int *' [-Wincompatible-pointer-types] bar(arr); ^~~ main.c:13:15: note: passing argument to parameter 'ptr' here void bar(int* ptr) ^ 2 warnings generated. 

Que se passe t-il ici? Comment pouvez-vous changer les appels de fonction pour que l’un d’entre eux accepte le tableau?

Edit: il ne s’agit pas d’ un duplicata de Comment passer un tableau multidimensionnel à une fonction en C et C ++, car je demande comment changer les appels de fonction eux-mêmes, et non les signatures de fonction.

Les tableaux et les pointeurs ne sont pas entièrement convertibles. Pour ne pas recevoir d’avertissement, vous aurez besoin d’une signature telle que void foo(int (*ptr)[4]) . Vous ne pouvez remplacer le premier [] par un * que lorsque vous passez un tableau comme celui-ci à une fonction.