2009-10-07 7 views
0

Je veux savoir ce qui se passe en mémoire lorsque vous déclarez:Que fait (int ** array;) créer?

int **array; 
+0

est pas là un outil de ligne de commande pratique qui explique C-définitions dans presque plaine anglais? Je ne peux pas trouver cet outil maintenant. – abelenky

+0

Le "Langage de programmation en C" de K & R (2ème édition), page 122, contient un programme qui traduira les déclarations C en une explication en anglais lisible par l'homme; http://packages.debian.org/sid/cdecl une version améliorée peut être trouvée en ligne. – ephemient

+0

cdecl. Voici une implémentation: http://linux.maruhn.com/sec/cdecl.html – dmckee

Répondre

6

Le compilateur réserve quatre octets (sur un système 32 bits, huit octets sur 64 bits) pour stocker un pointeur (qui pointe vers un autre pointeur, qui pointe vers un int). Aucune allocation de mémoire supplémentaire n'est faite, il est laissé au programmeur de définir réellement le pointeur pour pointer vers un autre emplacement de mémoire où le int*/array/... est stocké.

8

Il crée une variable pour stocker un pointeur vers un pointeur int.

2

C'est un pointeur vers un pointeur int. Ceci est souvent utilisé pour déclarer un tableau 2D, auquel cas chaque pointeur int est un tableau et le double pointeur est un tableau de tableaux.

4

Vous êtes en déclarant une variable de pointeur, donc vous allouer suffisamment d'espace pour une adresse mémoire (dépend de votre plate-forme/compilateur/etc.)

Le système de type veillera à ce que les seules adresses que vous attribuez à il contient d'autres adresses mémoire, et que ces adresses représentent l'adresse réelle d'une variable entière. Pour utiliser votre pointeur vers un pointeur, vous le dérérez une fois (pour obtenir l'adresse qui pointe réellement vers l'entier), puis une seconde fois (pour obtenir l'entier réel).

Vous pouvez ignorer le système de types en convertissant explicitement quelque chose d'autre (par exemple, i = & pDouble), mais cela n'est pas recommandé, sauf si vous êtes sûr de savoir ce que vous faites.

Si vous disposez d'un tableau à deux dimensions, vous pouvez le considérer de manière conceptuelle comme un tableau unidimensionnel de tableaux unidimensionnels représentant des lignes. Le premier niveau d'indirection serait de choisir la rangée, et l'autre de choisir la cellule dans la rangée.

1

Si je ne me trompe pas ...

Vous avez un tableau multidimensionnel arr[i][j] et

**arr adresses à arr[0][0]

*((*arr)+1) adresses à arr[0][1]

*(*(arr+1)+1) adresses à arr[1][1]

Exemple de code en C++

#include <iostream> 

using namespace std; 

int main() 
{ 
int **arr; 

arr = new int*[5]; 

for(int i = 0; i < 5; i++) 
    arr[i] = new int[5]; 

arr[0][1] = 1; 

cout << *((*arr)+1); // prints 1 
cout << arr[0][1] = 1; // prints 1 

} 
+0

Ceci est techniquement correct mais ne répond pas à la question initiale. –

+0

En fait, je suis nouveau à cet endroit. Ce qui se passe sur la mémoire est pointé par sth. J'ai donné des informations supplémentaires qui ne sont pas hors sujet. Dire ** ar ADDRESSES à arr [0] [0] signifie ÉVIDEMMENT "vous ne déclarez qu'un pointeur, tout comme * p" Est-ce hors format? Je pose la question parce que je me le demande vraiment. – JCasso

+1

Up-voté parce que la réponse est correcte.Ce n'est pas parce que ce n'est pas * exactement * ce que le questionneur voulait qu'il ne mérite pas le renvoi. –