6
votes

Pointeur sur le problème du tableau de pointeur

C'est probablement une question stupide, mais je ne comprends pas pourquoi cela fonctionne: xxx

test est un pointeur sur un pointeur droit? Le deuxième pointeur pointe vers le tableau, non? Dans ma compréhension, j'aurais besoin de déréférence le pointeur "Test" d'abord pour accéder au pointeur qui a le tableau. xxx

Où est ma pensée défectueuse?


1 commentaires

Il suffit de transporter le Baton en avant d'autres stalwarts. Si vous demandez que cela est stupide, alors ne vous demandez pas en cas de confusion, est une gaffe.


4 Réponses :


0
votes

L'expression * (test + 1) code> est équivalent à Test [1] code>, donc votre code pourrait être réécrit ainsi:

int** test = new int*[7];

int x = 7;
test[1] = &x;

cout << *test[1];


1 commentaires

Je sais que. Ce que je ne comprends pas, c'est pourquoi le test [1] pointe vers quelque chose de sensible. Dans mon avis de compréhension, c'est un pointeur à un pointeur, ce qui a à son tour un tas de mémoire disposé. Comme ceci: Test-> Array [0] [1] [2] [3] [



1
votes

Supposons que

int buf[10] = {0, 1, 2};
int *p = buf;


2 commentaires

@CHUBSDAD: S'il vous plaît voir mon commentaire à Marcelo. Je ne comprends pas pourquoi je devrais pouvoir passer un test de désarence comme si c'était un tableau avec []. Dans mon test de compréhension n'est pas un tableau, c'est un pointeur. Le tableau est à l'intérieur du deuxième pointeur.


@Blub: pour un "P" donné tel que "T * P;", où "t" est un type non vide et une expression intégrale "I ', l'expression p [i] essentiellement est équivalent à * (p + i) . Le compilateur ne limite pas cette syntaxe uniquement pour des objets de type matrice connus statilement. Le fait que p [i] est également un pointeur sur un tableau ne modifie pas la règle de base p [i] = * (p + i)



9
votes

Votre malentendu est que vous pensez avoir créé un pointeur vers un tableau de 7 int? Vous ne l'avez pas fait. Vous avez en réalité créé un tableau de 7 pointeurs à int. Donc, il n'y a pas de "deuxième pointeur" ici qui indiquerait à un tableau. Il n'y a qu'un seul pointeur qui pointe vers le premier des 7 pointeurs ( test ).

et avec * Test Vous obtenez ce premier pointeur que vous n'avez pas encore initialisé, cependant. Si vous ajouteriez 1 à que , vous ajouteriez 1 à une adresse aléatoire. Mais si vous ajoutez 1 à test Vous obtenez un pointeur qui pointe sur le deuxième pointeur du tableau. Et dérérir que vous obtenez ce deuxième pointeur, que vous avez fait initialiser.


Ce que vous décrivez serait obtenu par une syntaxe différente xxx

sans utiliser le typedef, cela ressemble à ce qui suit < PRE> XXX

C'est-à-dire, vous avez créé un tableau d'un élément, où le type d'élément de celui-ci est un réseau de 7 éléments d'int. Nouveau vous donne un pointeur de retour à cette matrice. Notez que la parenthèse est importante: le * a moins de priorité que le [7] , sinon, cela serait considéré comme une matrice de 7 pointeur sur des entiers.


3 commentaires

int (* test) [7] est un pointeur sur INT [7] non? Comment est-il possible qu'un tableau unidimensionnel abrite deux dimensions ... je pense que vous venez de trouver une autre chose que je ne reçois pas. Mais je comprends mon problème initial maintenant :) Se rappelement pour moi-même: le pointeur arithmétique fonctionne en ajoutant un octet décalé à une adresse mémoire. Un pointeur ininitialisé ne pointe rien encore à rien, donc je ne peux donc pas utiliser le math de pointeur dessus.


Je n'ai pas trouvé de tutoriels avancés sur le net qui traitent des changements de syntaxe fins comme INT ( test) [] et INT Test []. Avez-vous une suggestion où je peux lire là-dessus?


@Blub, il n'empêche pas vraiment deux dimensions. C'est comme int * p = neuf int [1]; . Vous pouvez demander «Comment une maison scalaire pourrait-elle être une matrice?». La réponse est que c'est l'inverse: la matrice abrite le scalaire (quel "P" pointe vers) et le tableau de 2 dimensions abrite le tableau 1-Dim (que nous indiquons).



14
votes

int ** test = neuf int * [7];

cout << *test[1] 


0 commentaires