Les tableaux multidimensionnels dans C sont des tableaux de tableaux. Les éléments d'un tableau à n dimensions sont (n-1) des tableaux dimensionnels. A[0]
, par exemple, est un int [3]
.
A: |24|25|26|44|45|46|
A[0]: |24|25|26|
A[1]: |44|45|46|
Dans certains contextes, un tableau est converti en un pointeur vers le premier élément du tableau, mais le tableau est lui-même pas un pointeur.
de la norme C, § 6.5.2.1-3:
3 opérateurs successifs en indice désignent un élément d'un objet de tableau multidimensionnel. Si E est un tableau à n dimensions (n≥2) de dimensions i × j × ... × k, alors E (utilisé comme autre qu'une lvalue) est converti en un pointeur vers un (n - 1) -dimensional array avec les dimensions j ×. . . × k. Si l'opérateur unary * est appliqué à ce pointeur explicitement, ou implicitement à la suite d'un indice, le résultat est le point-to (n-1) -dimensional array, qui lui-même est converti en pointeur s'il n'est pas utilisé comme lvalue . Il en résulte que les tableaux sont stockés dans l'ordre des lignes majeures (le dernier indice varie le plus rapidement).
4 EXEMPLE Considérons l'objet tableau défini par la déclaration
int x[3][5];
Ici, x est un 3 × 5 matrice d'entiers; plus précisément, x est un tableau de trois objets élémentaires, dont chacun est un tableau de cinq nombres entiers. Dans l'expression x[i]
, qui est équivalente à (*((x)+(i)))
, x est d'abord converti en un pointeur vers le tableau initial de cinq ints. Alors i est ajusté en fonction du type de x, ce qui implique conceptuellement de multiplier i par la taille de l'objet sur lequel pointe le pointeur, à savoir un tableau de cinq objets int. Les résultats sont ajoutés et l'indirection est appliquée pour produire un tableau de cinq ints. Lorsqu'il est utilisé dans l'expression x[i][j]
, ce tableau est à son tour converti en pointeur sur le premier des entiers. Par conséquent, x[i][j]
génère un int.
Pour créer un ptr_array
comme schématisée:
int (*ptr_array[2])[3]
ptr_array[0] = A;
ptr_array[1] = A+1;
// or:
ptr_array[0] = &A[0];
ptr_array[1] = &A[1];
// or even:
ptr_array[0] = (int(*)[3])A[0];
ptr_array[1] = (int(*)[3])A[1];
// though this last shouldn't be used in production code
Voici comment fonctionne la déclaration. D'après le diagramme, ptr_array est un tableau de taille 2.
... ptr_array[2] ...
Les éléments du tableau sont des pointeurs
*ptr_array[2]
à des tableaux de taille 3
(*ptr_array[2])[3]
de ints
int (*ptr_array[2])[3]
Si vous n'êtes jamais certain comment déclarer quelque chose comme cela, vous pouvez utiliser cdecl:
cdecl> declare ptr_array as array 2 of pointer to array 3 of int
int (*ptr_array[2])[3]
Vous pouvez installer une version de ligne de commande de cdecl (si pas déjà installé) sur votre ordinateur de développement. La méthode exacte dépend de la plate-forme. Consultez la documentation et le Web en général.
Votre compréhension est fausse: 'A' n'est pas du tout un pointeur. C'est un tableau. Un tableau n'est pas un pointeur. –
Désolé je voulais dire un type compatible avec ..Signification Je peux dire par exemple int (* s) [3] = A, bien que A soit un tableau – Mathai
Deux excellentes ressources pour comprendre les déclarations complexes en C: (1) La règle horaire/en spirale: http: // c-faq .com/decl/spiral.anderson.html (2) cdecl: http://cdecl.org/ – The111