web-dev-qa-db-fra.com

Un pointeur sur un tableau 2D

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]?

48
user1047092

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]);
36
Aaron McDaid

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] .

8
Robᵩ

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[][] */
5
Blagovest Buyukliev

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 .
1
sdinesh94

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
}
0
reza moradi