2011-05-12 3 views
4

Pourquoi le tableau de pointeurs "équivalence" ne fonctionne-t-il pas dans le cas suivant?pointeurs et tableaux

void foo(int** x) { 
    cout << x[0][1]; 
} 

int main() { 
    int a[2][2] = {{1,2},{2,3}}; 
    foo(a); 
} 

merci

+6

Ce qui ne fonctionne pas? quel message d'erreur obtenez-vous? – Dani

+0

duplication possible de [en C, sont des pointeurs de tableaux ou utilisés comme pointeurs?] (Http://stackoverflow.com/questions/4607128/in-c-are-arrays-pointers-or-used-as-pointers) – ildjarn

+0

tableau de pointeur "équivalence" – user695652

Répondre

11

Le modèle de mémoire de int ** et int [2] [2] est différent.
int a[2][2] est stocké dans la mémoire comme:

&a  : a[0][0] 
&a + 4 : a[0][1] 
&a + 8 : a[1][0] 
&a + 12: a[1][1] 

int** x:

&x  : addr1 
&x + 4 : addr2 
addr1 : x[0][0] 
addr1 + 4: x[0][1] 
addr2 : x[1][0] 
addr2 + 4: x[1][1] 

tout addr1 et addr2 sont des adresses juste en mémoire.
Vous ne pouvez pas convertir l'un à l'autre.

+1

'& x' serait de type' int *** '... vouliez-vous dire' * x' ou 'x [INDEX]', où 'x' est déréférencé pour donner le' int * 'qu'il pointe vers (lequel dans ce cas pointe vers un tableau de type 'int')? – Jason

+0

C'est en fait x au lieu de & x car c'est l'adresse des 2 autres adresses. – Dani

4

Il ne fonctionne pas, car seul le premier niveau du tableau multidimensionnel désintègre à un pointeur. Essayez ceci:

#include <iostream> 
using std::cout; 

void foo(int (*x)[2]) { 
    cout << x[0][1]; 
} 

int main() { 
    int a[2][2] = {{1,2},{2,3}}; 
    foo(a); 
} 
0

car le type n'est pas int **. ce droit pour la fonction foo

foo (int * [2]);

type de pointeur a n'est pas int **, exactement int * [2] ..

Questions connexes