Pour bien comprendre cela, vous devez comprendre les concepts suivants:
Les tableaux ne sont pas des pointeurs!
Tout d'abord (et cela a été assez prêché), les tableaux ne sont pas des pointeurs . Au lieu de cela, dans la plupart des utilisations, ils `` se désintègrent '' vers l'adresse de leur premier élément, qui peut être attribué à un pointeur:
int a[] = {1, 2, 3};
int *p = a; // p now points to a[0]
Je suppose que cela fonctionne de cette manière afin que le contenu du tableau soit accessible sans les copier tous. C'est juste un comportement de types de tableaux et ne veut pas dire qu'ils sont la même chose.
Tableaux multidimensionnels
Les tableaux multidimensionnels ne sont qu'un moyen de «partitionner» la mémoire d'une manière que le compilateur / la machine peut comprendre et utiliser.
Par exemple, int a[4][3][5]
= un tableau contenant 4 * 3 * 5 (60) «morceaux» de mémoire de taille entière.
L'avantage sur l'utilisation de int a[4][3][5]
vs plainint b[60]
est qu'ils sont maintenant «partitionnés» (il est plus facile de travailler avec leurs «morceaux», si nécessaire), et le programme peut maintenant effectuer une vérification liée.
En fait, int a[4][3][5]
est stocké exactement comme int b[60]
dans la mémoire - La seule différence est que le programme le gère maintenant comme s'il s'agissait d'entités séparées de certaines tailles (plus précisément, quatre groupes de trois groupes de cinq).
Gardez à l'esprit: les deux int a[4][3][5]
et int b[60]
sont identiques en mémoire, et la seule différence est la façon dont ils sont gérés par l'application / le compilateur
{
{1, 2, 3, 4, 5}
{6, 7, 8, 9, 10}
{11, 12, 13, 14, 15}
}
{
{16, 17, 18, 19, 20}
{21, 22, 23, 24, 25}
{26, 27, 28, 29, 30}
}
{
{31, 32, 33, 34, 35}
{36, 37, 38, 39, 40}
{41, 42, 43, 44, 45}
}
{
{46, 47, 48, 49, 50}
{51, 52, 53, 54, 55}
{56, 57, 58, 59, 60}
}
À partir de là, vous pouvez clairement voir que chaque «partition» est juste un tableau dont le programme effectue le suivi.
Syntaxe
Désormais, les tableaux sont syntaxiquement différents des pointeurs . Plus précisément, cela signifie que le compilateur / la machine les traitera différemment. Cela peut sembler une évidence, mais jetez un œil à ceci:
int a[3][3];
printf("%p %p", a, a[0]);
L'exemple ci-dessus imprime deux fois la même adresse mémoire, comme ceci:
0x7eb5a3b4 0x7eb5a3b4
Cependant, un seul peut être affecté à un pointeur aussi directement :
int *p1 = a[0]; // RIGHT !
int *p2 = a; // WRONG !
Pourquoi ne peut pas a
être affecté à un pointeur mais a[0]
peut?
Ceci, simplement, est une conséquence des tableaux multidimensionnels, et je vais vous expliquer pourquoi:
Au niveau de « a
», nous voyons toujours que nous avons une autre «dimension» à espérer. Au niveau de ' a[0]
', cependant, nous sommes déjà dans la dimension supérieure, donc en ce qui concerne le programme, nous ne regardons qu'un tableau normal.
Vous demandez peut-être:
Pourquoi est-il important que le tableau soit multidimensionnel en ce qui concerne la création d'un pointeur pour lui?
Il vaut mieux penser de cette façon:
Une `` désintégration '' d'un tableau multidimensionnel n'est pas seulement une adresse, mais une adresse avec des données de partition (AKA, elle comprend toujours que ses données sous-jacentes sont constituées d'autres tableaux), qui se compose de limites définies par le tableau au-delà de la première dimension.
Cette logique de 'partition' ne peut pas exister dans un pointeur sauf si nous la spécifions:
int a[4][5][95][8];
int (*p)[5][95][8];
p = a; // p = *a[0] // p = a+0
Sinon, la signification des propriétés de tri du tableau est perdue.
Notez également l'utilisation de parenthèses autour de *p
: int (*p)[5][95][8]
- C'est pour spécifier que nous faisons un pointeur avec ces limites, pas un tableau de pointeurs avec ces limites:int *p[5][95][8]
Conclusion
Revoyons:
- Les tableaux se désintègrent en adresses s'ils n'ont aucun autre objectif dans le contexte utilisé
- Les tableaux multidimensionnels ne sont que des tableaux de tableaux - Par conséquent, l'adresse «décomposée» portera le fardeau de «J'ai des sous-dimensions»
- Les données de dimension ne peuvent pas exister dans un pointeur à moins que vous ne les lui donniez .
En bref: les tableaux multidimensionnels se désintègrent en adresses qui permettent de comprendre leur contenu.