52 votes

Un pointeur vers le 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, 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] ?

43voto

cpx Points 5936
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.

0 votes

Est-ce que "p" ne deviendrait pas un tableau de 3 pointeurs entiers, avec la première valeur pointant vers la première valeur de "a" ?

40voto

Aaron McDaid Points 7761

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]);

2 votes

Vous pourriez même écrire [3]a par exemple :) C'est une bonne façon d'apprendre ce que sont réellement les tableaux en C.

1 votes

Combien de mémoire prend cette déclaration ? int (*p)[65]; ? ? Est-ce un pointeur ou 65 pointeurs ?

12voto

Robᵩ Points 50501

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

6voto

Blagovest Buyukliev Points 22767

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

0 votes

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

0 votes

p est simplement un pointeur vers un tableau de 3 ints. Il ne sait pas que la première dimension de a est 2, parce qu'il est assigné au premier élément de a qui est exactement du type int[3] .

3voto

sdinesh94 Points 498

A noter également :

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 .

Prograide.com

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.

Powered by:

X