Quand un tableau est transmis à une fonction, elle « désintégrations » pour un pointeur vers le premier élément. Donc, étant donné:
T a[10];
f(a);
Dans l'appel f(a)
, a
est en fait &a[0]
, à savoir, un pointeur, et le type est T *
(le type de &a[0]
).
Lorsque vous avez un tableau de tableaux, la règle applicable:
T a[10][5];
f(a);
a
désintègre à un pointeur à nouveau, égal à &a[0]
. a[0]
est de type "tableau [5] de T
". Ainsi, &a[0]
est de type « pointeur sur un tableau [5] de T
», à savoir, si vous deviez déclarer un pointeur p
à égal à &a[0]
, vous feriez:
T (*p)[5]; /* parentheses because [] binds tighter than * */
p = &a[0];
Compte tenu de ce qui précède, et en supposant votre tableau est déclaré dans le code d'appel comme int a[10][10];
, vous devez déclarer votre fonction:
function_name(int (*a)[10]);
Pour plus, voir this.
Il y a une erreur de syntaxe dans function_name(int[10][10] a)
— vous devez spécifier la taille du tableau après le nom "variable": function_name(int a[10][10])
. En fait, ce qui précède est équivalent à function_name(int (*a)[10])
, à cause de la "désintégration" mentionnée ci-dessus.
Modifier: ah, je pense que je comprends maintenant. Vous ne pouvez pas déclarer une fonction qui prend à la fois un tableau "bidimensionnel" et un pointeur-sur-pointeur, pour les raisons mentionnées ci-dessus (le "déclin" en pointeur n'arrive qu'une fois). Un pointeur vers pointeur ne peut pointer vers des données contiguës, et peut avoir un nombre différent d'éléments dans chaque "ligne". Un tableau de tableaux ne peut pas avoir ces propriétés. Ils sont fondamentalement différents.