Tableau multidimensionnel et pointeur sur les pointeurs

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érateur sizeof 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] .