Lorsque vous créez le tableau multi-dimensionnel char a[10][10]
, il est dit dans mon livre que vous devez utiliser un paramètre similaire à char a[][10]
pour transmettre le tableau à une fonction.
Pourquoi devez-vous spécifier la longueur en tant que telle? Ne passez-vous pas simplement un pointeur double à être avec, et ce pointeur double ne pointe-t-il pas déjà vers la mémoire allouée? Alors, pourquoi le paramètre ne pourrait-il pas être char **a
? Réaffectez-vous une nouvelle mémoire en fournissant le deuxième 10?
Les pointeurs ne sont pas des tableaux
Un caractère déréférencé char **
est un object de type char *
.
Un caractère déréférencé char (*)[10]
est un object de type char [10]
.
Les tableaux ne sont pas des pointeurs
Voir l’ entrée c-faq sur ce sujet même .
Suppose que tu as
char **pp; char (*pa)[10];
et, pour les besoins de l’argumentation, les deux pointent au même endroit: 0x420000.
pp == 0x420000; /* true */ (pp + 1) == 0x420000 + sizeof(char*); /* true */ pa == 0x420000; /* true */ (pa + 1) == 0x420000 + sizeof(char[10]); /* true */ (pp + 1) != (pa + 1) /* true (very very likely true) */
et c’est pourquoi l’argument ne peut pas être de type char**
. De plus, char**
et char (*)[10]
ne sont pas des types compatibles, de sorte que les types d’arguments (le tableau décomposé) doivent correspondre aux parameters (le type de la fonction prototype)
Norme de langage C, projet n1256 :
6.3.2.1 Lvalues, tableaux et désignateurs de fonctions
…
3 Sauf s’il s’agit de l’opérande de l’opérateursizeof
ou de l’opérateur unaire&
, ou s’il s’agit d’un littéral utilisé pour initialiser un tableau, une expression de type ” tableau de type ” est convertie en une expression de type ” pointeur taper ” qui pointe vers l’élément initial de l’object tableau et n’est pas une lvalue. Si l’object tableau a une classe de stockage de registre, le comportement n’est pas défini.
Compte tenu d’une déclaration de
char a[10][10];
le type de l’expression de tableau a
est “tableau de 10 éléments d’un tableau de caractères de 10 éléments”. Selon la règle ci-dessus, cela est converti en type “pointeur vers un tableau de caractères de 10 éléments” ou caractère char (*)[10]
.
Rappelez-vous que dans le contexte d’une déclaration de paramètre de fonction, T a[N]
et T a[]
sont identiques à T *a
; T a[][10]
est donc identique à T (*a)[10]
.