J'ai une question sur un pointeur vers un tableau 2D. Si un tableau est quelque chose comme
int a[2][3];
alors, s'agit-il d'un pointeur sur le tableau a
?
int (*p)[3] = a;
Si cela est correct, je me demande ce que signifie [3]
de int(*p)[3]
?
Plutôt que de faire référence à int[2][3]
en tant que "tableau 2d", vous devriez considérer qu'il s'agit d'un "tableau de tableaux". C'est un tableau avec deux éléments, où chaque élément est lui-même un tableau avec 3 ints.
int (*p)[3] = a;
Vous pouvez utiliser p
pour désigner l'un des deux éléments de a
. p
pointe vers un tableau à trois entiers, à savoir le premier élément de ce type. p+1
pointerait vers le deuxième tableau à trois entiers. Pour initialiser p
afin qu'il pointe vers le deuxième élément, utilisez:
int (*p)[3] = &(a[1]);
Voici des moyens équivalents pour désigner le premier des deux éléments.
int (*p)[3] = a; // as before
int (*p)[3] = &(a[0]);
Stricly parlant, non, int (*p)[3] = a;
n'est pas un pointeur sur a
. C'est un pointeur sur le premier élément de a
. Le premier élément de a
est un tableau de trois ints. p
est un pointeur sur un tableau de trois ints.
Un pointeur sur le tableau a
serait déclaré ainsi:
int (*q)[2][3] = &a;
Les valeurs numériques de p
et q
sont susceptibles (voire même obligatoires) d'être identiques, mais elles sont de types différents. Cela entrera en jeu lorsque vous utiliserez l'arithmétique sur p
ou q
. p+1
pointe vers le deuxième élément du tableau a
, tandis que q+1
pointe vers la mémoire juste au-delà de la fin du tableau a
.
Rappelez-vous: cdecl est votre ami: int a[2][3]
, int (*q)[2][3]
.
Le [3]
fait partie du type. Dans ce cas, p
est un pointeur sur un tableau de taille 3 qui contient les entiers.
Le type particulier d'un tableau inclut toujours sa taille, de sorte que vous ayez les types int *[3]
ou int *[5]
, mais pas uniquement int *[]
, dont la taille n'est pas dé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[][] */
Notez aussi:
int *p[5] // p is an array of 5 pointers
int (*p)[5] // p points to an array of 5 ints
int (*(p+5))[10] // p is a pointer to a structure where the structure's 5th element has 10 ints .
vous pouvez pointer sur tableau 2d comme tableau 1d
#include <iostream>
int main()
{
int array[2][2] = {{0,1}, {2,3}}; // array
int *ptr;
ptr=(int*)array;
std::cout << *(ptr) << '\n';//out 0
std::cout << *(ptr+1) << '\n';//out 1
std::cout << *(ptr+2) << '\n';//out 2
std::cout << *(ptr+3) << '\n';//out 3
}