2012-01-02 2 views
1

Ma compréhension est A peut être utilisé pour désigner les trois premiers éléments et A + 1 aux trois suivants. Est-il possible de déclarer un tableau de pointeurs dans un tableau.Tableau de pointeurs vers array of int

ptr_array  

    +----+     +----+----+----+       
    | |  ---->  | | | | 
    | |     | 24 | 25 | 26 | 
    +----+     +----+----+----+ 
    | |     | 44 | 45 | 46 | 
    | |   ----> | | | | 
    +----+     +----+----+----+ 
Array of pointers   two dimensional array of three integers 
    to array of 3 

Comment puis-je déclarer ptr_array, de sorte que

ptr_array[0] = A; 

et

ptr_array[1] = A + 1; 
+0

Votre compréhension est fausse: 'A' n'est pas du tout un pointeur. C'est un tableau. Un tableau n'est pas un pointeur. –

+0

Désolé je voulais dire un type compatible avec ..Signification Je peux dire par exemple int (* s) [3] = A, bien que A soit un tableau – Mathai

+0

Deux excellentes ressources pour comprendre les déclarations complexes en C: (1) La règle horaire/en spirale: http: // c-faq .com/decl/spiral.anderson.html (2) cdecl: http://cdecl.org/ – The111

Répondre

5

Les tableaux multidimensionnels dans C sont des tableaux de tableaux. Les éléments d'un tableau à n dimensions sont (n-1) des tableaux dimensionnels. A[0], par exemple, est un int [3].

 
A: |24|25|26|44|45|46| 
A[0]: |24|25|26| 
A[1]: |44|45|46| 

Dans certains contextes, un tableau est converti en un pointeur vers le premier élément du tableau, mais le tableau est lui-même pas un pointeur.

de la norme C, § 6.5.2.1-3:

3 opérateurs successifs en indice désignent un élément d'un objet de tableau multidimensionnel. Si E est un tableau à n dimensions (n≥2) de dimensions i × j × ... × k, alors E (utilisé comme autre qu'une lvalue) est converti en un pointeur vers un (n - 1) -dimensional array avec les dimensions j ×. . . × k. Si l'opérateur unary * est appliqué à ce pointeur explicitement, ou implicitement à la suite d'un indice, le résultat est le point-to (n-1) -dimensional array, qui lui-même est converti en pointeur s'il n'est pas utilisé comme lvalue . Il en résulte que les tableaux sont stockés dans l'ordre des lignes majeures (le dernier indice varie le plus rapidement).

4 EXEMPLE Considérons l'objet tableau défini par la déclaration

int x[3][5]; 

Ici, x est un 3 × 5 matrice d'entiers; plus précisément, x est un tableau de trois objets élémentaires, dont chacun est un tableau de cinq nombres entiers. Dans l'expression x[i], qui est équivalente à (*((x)+(i))), x est d'abord converti en un pointeur vers le tableau initial de cinq ints. Alors i est ajusté en fonction du type de x, ce qui implique conceptuellement de multiplier i par la taille de l'objet sur lequel pointe le pointeur, à savoir un tableau de cinq objets int. Les résultats sont ajoutés et l'indirection est appliquée pour produire un tableau de cinq ints. Lorsqu'il est utilisé dans l'expression x[i][j], ce tableau est à son tour converti en pointeur sur le premier des entiers. Par conséquent, x[i][j] génère un int.

Pour créer un ptr_array comme schématisée:

int (*ptr_array[2])[3] 
ptr_array[0] = A; 
ptr_array[1] = A+1; 
// or: 
ptr_array[0] = &A[0]; 
ptr_array[1] = &A[1]; 
// or even: 
ptr_array[0] = (int(*)[3])A[0]; 
ptr_array[1] = (int(*)[3])A[1]; 
// though this last shouldn't be used in production code 

Voici comment fonctionne la déclaration. D'après le diagramme, ptr_array est un tableau de taille 2.

... ptr_array[2] ... 

Les éléments du tableau sont des pointeurs

*ptr_array[2] 

à des tableaux de taille 3

(*ptr_array[2])[3] 

de ints

int (*ptr_array[2])[3] 

Si vous n'êtes jamais certain comment déclarer quelque chose comme cela, vous pouvez utiliser cdecl:

 
cdecl> declare ptr_array as array 2 of pointer to array 3 of int 
int (*ptr_array[2])[3] 

Vous pouvez installer une version de ligne de commande de cdecl (si pas déjà installé) sur votre ordinateur de développement. La méthode exacte dépend de la plate-forme. Consultez la documentation et le Web en général.

+0

@outis .. Oui int (* ptr_array [2]) [3] est exactement ce que je cherchais! excellente explication! j'ai appris quelque chose de nouveau aujourd'hui. – Mathai

2

Dans une déclaration comme int A[2][3], A est d'un pointeur sur un tableau de 3 ce qui signifie A est de type int(*)[3]

N ° A est un tableau, pas un pointeur. Il est de type int [2][3].

Comment puis-je déclarer ptr_array, de sorte que

ptr_array[0] = A; 

et

ptr_array[1] = A + 1; 

Si par A+1 vous voulez dire "la deuxième matrice longueur 3", alors vous devez simplement faites ceci:

int (*ptr_array)[3] = A; 

Un tableau se désintègre pour devenir un pointeur vers son premier élément dans la plupart des situations. Je suggère de lire la FAQ C sur les tableaux et les pointeurs: http://c-faq.com/aryptr/index.html.

+0

Ceci est plus un commentaire qu'une réponse – BlackBear

+0

@BlackBear: Réponse terminée maintenant! –

+0

Désolé je voulais dire un type compatible avec .. Signification Je peux dire par exemple int (* s) [3] = A, bien que A soit un tableau ... donc comme vous l'avez dit ptr_array n'est toujours pas un tableau. C'est un pointeur vers un tableau de 3. – Mathai

-1

Oui. Vous pouvez déclarer un tableau pour être de tout ce que vous voulez.

Votre déclaration

int A[2][3]; 

définit un tableau à deux dimensions de ints, de la taille 2x3. A[0] est un pointeur vers le début de un tableau de 3 ints, comme c'est A[1]. A[0][0] est le premier élément du premier tableau. A[1][2] est le dernier élément du dernier tableau.

+0

'& A + sizeof (* int)'? o_O Votre explication de ce qu'est 'A' est incorrecte: dans' int A [2] [3] '(pas' int [2] [3] A'), il n'y a pas de pointeurs. Un tableau n'est pas "juste un pointeur, vraiment." –

+0

Je ne pense pas que ce que vous avez dit est juste. A [0] est un pointeur vers int. Vous pouvez vérifier cela en exécutant ces déclarations avec gcc avec l'option -Wall \t int (* ptr) [3] = A [0]; // Type de pointeur incompatible int * int_ptr = A [0]; // pas d'avertissement – Mathai

+0

oups, désolé les gars. J'ai gaffé sur celui-là. Edité pour réparer. – rejj

-1

A [2] [3] est plus un tableau qu'un pointeur. Il n'y a que quelques cas que vous pouvez considérer comme des pointeurs. A est un tableau à 6 entiers. A est de type tableau entier.

Vous pouvez déclarer ptr_array [0] comme A [0] et ptr_array comme A [1].

+1

Ce n'est pas "plus un tableau qu'un pointeur", c'est ** un tableau. "A est de type integer array" ne signifie vraiment rien. –

+0

Je veux dire qu'il devrait être considéré comme un tableau plutôt que de traiter A comme un pointeur. –