web-dev-qa-db-fra.com

Pointeur vers tableau de pointeurs

J'ai un tableau de pointeurs int int* arr[MAX]; et je veux stocker son adresse dans une autre variable. Comment définir un pointeur sur un tableau de pointeurs? c'est à dire.:

int* arr[MAX];
int (what here?) val = &arr;
11
moteutsch

Devrait juste être:

int* array[SIZE];
int** val = array;  

Il n'est pas nécessaire d'utiliser un opérateur d'adresse-de-sur array, car les tableaux se décomposent en pointeurs implicites du côté droit de l'opérateur d'affectation.

13
Jason

La bonne réponse est:

int* arr[MAX];
int* (*pArr)[MAX] = &arr;

Ou juste:

        int* arr  [MAX];
typedef int* arr_t[MAX];

arr_t* pArr = &arr;

La dernière partie se lit comme suit: "pArr est un pointeur sur un tableau d'éléments MAX de type pointeur sur int".

En C, la taille du tableau est stockée dans le type, pas dans la valeur. Si vous voulez que ce pointeur gère correctement l'arithmétique de pointeur sur les tableaux (au cas où vous voudriez créer un tableau à deux dimensions à partir de ceux-ci et utiliser ce pointeur pour l'itérer), vous avez souvent besoin malheureusement d'avoir la taille du tableau incorporé dans le type de pointeur.

Heureusement, puisque C99 et VLA (peut-être même avant C99?), MAX peut être spécifié au moment de l'exécution, pas lors de la compilation.

22
Kos

IIRC, les tableaux sont implicitement convertibles en pointeurs, il serait donc:

int ** val = arr;
1

Je crois que la réponse est simplement:

int **val;<br>
val = arr;
0
Ruben Gonçalves

Autant que je sache, il n'y a pas de type spécifique "tableau d'entiers" dans c, il est donc impossible d'avoir un pointeur spécifique sur celle-ci. La seule chose que vous puissiez faire est d'utiliser un pointeur sur int: int*, mais vous devez prendre en compte une taille de int et la longueur de votre tableau.

0
dhblah

Selon cette source http://unixwiz.net/techtips/reading-cdecl.html , en utilisant la règle "allez à droite quand vous pouvez, allez à gauche quand vous devez", nous obtenons les 2 significations suivantes du déclarations données dans les réponses précédentes - 

int **val ==> val is a pointer to pointer to int
int* (*pArr)[MAX] ==> pArr is a pointer to an array of MAX length pointers to int.

J'espère que les significations ci-dessus ont un sens et si elles ne le font pas, ce serait probablement une bonne idée de parcourir la source mentionnée ci-dessus.

Maintenant, il devrait être clair que la deuxième déclaration est celle que moteutsch recherche car elle déclare un pointeur sur un tableau de pointeurs.

Alors pourquoi le premier fonctionne-t-il aussi? Rappelez-vous que 

int* arr[MAX]

est un tableau d'entiers pointeurs . Ainsi, val est un pointeur sur, le pointeur sur le premier int déclaré dans le tableau de pointeurs int.

0
VSarin