J'ai une question sur un pointeur vers un tableau 2d. Si un tableau est quelque chose comme
int a[2][3];
alors, est-ce un pointeur vers le tableau a
?
int (*p)[3] = a;
Si c'est correct, je me demande ce que font [3]
moyen de int(*p)[3]
?
J'ai une question sur un pointeur vers un tableau 2d. Si un tableau est quelque chose comme
int a[2][3];
alors, est-ce un pointeur vers le tableau a
?
int (*p)[3] = a;
Si c'est correct, je me demande ce que font [3]
moyen de int(*p)[3]
?
int a[2][3];
a
est lu comme un tableau 2 de tableau 3 de int qui est simplement un tableau de tableaux. Lorsque vous écrivez ,
int (*p)[3] = a;
Elle déclare p
comme un pointeur vers le premier élément qui est un tableau . Donc, p
pointe vers le tableau de 3 ints qui est un élément du tableau de tableaux.
Prenons cet exemple :
int a[2][3]
+----+----+----+----+----+----+
| | | | | | |
+----+----+----+----+----+----+
\_____________/
|
|
|
p int (*p)[3]
Ici, p
est votre pointeur qui pointe vers le tableau de 3 ints qui est un élément du tableau de tableaux.
Plutôt que de se référer à int[2][3]
comme un "tableau 2d", vous devez le considérer comme un "tableau de tableaux". Il s'agit d'un tableau contenant deux éléments, où chaque élément est lui-même un tableau contenant 3 ints.
int (*p)[3] = a;
Vous pouvez utiliser p
pour pointer vers l'un ou l'autre des deux éléments dans a
. p
pointe vers un tableau de trois éléments, à savoir le premier élément. p+1
pointerait vers le deuxième tableau de trois int. Pour initialiser p
pour pointer vers le deuxième élément, utilisez :
int (*p)[3] = &(a[1]);
Voici des façons équivalentes de pointer vers le premier des deux éléments.
int (*p)[3] = a; // as before
int (*p)[3] = &(a[0]);
Strictement parlant, non, int (*p)[3] = a;
n'est pas un pointeur vers a
. C'est un pointeur vers le premier élément de a
. Le premier élément de a
est un tableau de trois ints. p
est un pointeur vers un tableau de trois ints.
Un pointeur vers le tableau a
serait déclaré ainsi :
int (*q)[2][3] = &a;
La valeur numérique de p
y q
sont probablement (ou peut-être même tenus d'être) les mêmes, mais ils sont de types différents. Ceci entrera en jeu lorsque vous effectuerez des opérations arithmétiques sur p
o q
. p+1
pointe vers le deuxième élément du tableau a
alors que q+1
pointe vers la mémoire située juste après la fin du tableau a
.
Rappelez-vous : cdecl est votre ami : int a[2][3]
, int (*q)[2][3]
.
El [3]
fait partie du type. Dans ce cas p
est un pointeur vers un tableau de taille 3 qui contient des ints.
Le type particulier d'un tableau inclut toujours sa taille, de sorte que vous avez les types int *[3]
o int *[5]
mais pas seulement int *[]
qui a une taille indéfinie.
int *x[20]; /* type of x is int *[20], not just int *[] */
int y[10][10]; /* type of y is int[10][10], not just int[][] */
Merci pour votre commentaire. Quand vous dites taille, cela signifie-t-il que (*p) a [0], [1]], [2] ? Si c'est le cas, où y a-t-il une place pour [2] ? Ou est-ce qu'il pointe vers [0][0] et [0][1] ?
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.