2009-11-12 7 views
0

Une question simple sur l'accès aux informations de tableau à l'aide de pointeurs que je n'arrive pas à comprendre. Je passe un tas de tableaux multidimensionnels dans une fonction. Maintenant, ils ne sont pas dynamiques, mais même si statique, je dois les passer en tant que pointeurs droit? (Si je me trompe, veuillez me corriger)Accès au tableau C++ via le pointeur

Donc une fois que je les passe dans une fonction, comment y accéder?

int main() 
{ 
    int anArray[5][5] = // member intializations 
    foo(*anArray); 
} 
void foo(int * anArray) //or should that be int ** anArray ?? 
{ 
    cout << anArray[2][2] << endl; // how should i address this..? 
} 
+1

Jetez un oeil à http://c-faq.com/aryptr/index.html – Artelius

+0

le lien ne fonctionne pas .. apparemment ne peut pas trouver le serveur. est-ce en panne ou est-ce juste moi ..? thx si – user200632

+0

Puis préfixer l'URL avec 'cache:' et tapez google :) – Artelius

Répondre

2

Si vos tableaux sont de taille fixe, vous pouvez le faire de cette façon:

void foo(int arr[5][5]) 
{ 
    cout << arr[2][2] << endl; 
} 
+0

Je sais que j'ai déclaré comme taille fixe, mais si je voulais travailler avec tableau dynamique/pointeurs, comment pourrais-je y accéder? – user200632

+0

http://www.functionx.com/cpp/Lesson14.htm j'espère que c'est correct .. – user200632

0

Vous pouvez accéder à un pointeur comme vous pouvez accéder à un tableau. Donc, votre fonction "foo" est correcte. Le principal problème que je vois avec votre code est cette ligne

foo(*anArray); 

changement à

foo(anArray); 

ou si vous voulez être vraiment explicite

foo(&anArray[0][0]) 

Maintenant err ... humm. .. quelques pointeurs. Depuis un pointeur est un tableau est un pointeur, vous pouvez vraiment vous tirer dans le pied. Par exemple, dans foo, vous savez que la mémoire transmise est un pointeur, mais vous voulez probablement communiquer sa taille pour une vérification appropriée. De nombreux débordements de buffer résultent d'hypothèses sur la taille incorrecte d'un tableau. C'est ce qu'on appelle un dépassement de mémoire tampon, et vous risquez d'écraser par inadvertance de la mémoire dans d'autres parties de la mémoire de votre programme (ce qui est bien le cas de votre programme) causant un comportement très étrange. Par exemple, une variable de pile dans votre programme peut soudainement prendre une valeur qui n'a pas été affectée.

Si vous avez accès à std :: vector ou boost :: array, je vous le recommande pour éviter tout problème de dépassement de tampon.

2

Un tableau est une série d'objets disposés consécutivement dans la mémoire.

int blah[5][10]; 

est un tableau de 5 [tableau de 10 [int] s] s.

Par exemple, blah[0] vous donnera le 1er tableau de 10 ints, blah[1] vous donnera la seconde, etc.

Pour être en mesure de calculer les décalages de mémoire, C a besoin de savoir exactement combien d'éléments sont dans chaque "subarray".

Vous pouvez le faire

void foo(int anArray[][10]) { 
    cout << anArray[2][2] << endl; 
} 

ou cette

void foo(int anArray[5][10]) { 
    cout << anArray[2][2] << endl; 
} 

mais vous ne pouvez pas faire [][].

Ceci est tout à fait différent de

void foo(int *anArray[10]) { //array of 10 pointers 

ou

void foo(int **anArray) { //pointer to pointer (could be a pointer to an array of pointers to more arrays) 

Si vous ne connaissez pas les dimensions du tableau à l'avance, vous devez utiliser une structure de données plus complexes. transmettre Peut-être que le rapport largeur/hauteur de la matrice à la fonction (ou utiliser une structure contenant ces informations) et de résoudre les 2 dimensions sur un réseau de dimension 1, comme suit:

int *arr = malloc(width*height * sizeof(int)); 
... 
cout << arr[x + y * width] << endl; 
+0

une question .. dans le cas où je passerais tableau statique, ne devrait pas toto (anArray) en int principal suffit? parce que je reçois des erreurs, je ne peux pas convertir 'int' en 'int *' – user200632

+0

étant donné que la taille d'un tableau est déjà connue, je viens de passer le nom de tableau à foo ... thx pour l'aide, btw. – user200632

+0

'foo (anArray)' ne devrait pas vous donner cette erreur, car 'anArray' n'est pas un' int'. – Artelius

0

en C++ la matrice est en fait un pointeur vers le premier élément.
lors du passage * unTableau où unTableau est unTableau [5] [5], vous faire passer le contenu de la cellule unTableau [0] qui est un pointeur vers un tableau d'entiers,

si la fonction foo doit être reçu un pointeur : void foo (int * intanArray)

Questions connexes