2011-08-10 4 views
1

Comment attribuer un pointeur à un tableau bidimensionnel?Pointeur sur un tableau à deux dimensions

Le code suivant ne fonctionnera pas.

float a1[2][2] = { {0,1},{2,3}}; 
float a2[3][2] = { {0,1},{2,3},{4,5}}; 
float a3[4][2] = { {0,1},{2,3},{4,5},{6,7}}; 

float** b = (float**)a1; 

//float** b = (float**)a2; 
//float** b = (float**)a3; 

cout << b[0][0] << b[0][1] << b[1][0] << b[1][1] << endl; 

Répondre

4

a1 n'est pas convertible en float**. Donc ce que vous faites est illégal et ne produirait pas le résultat souhaité.

Essayez ceci:

float (*b)[2] = a1; 
cout << b[0][0] << b[0][1] << b[1][0] << b[1][1] << endl; 

Cela fonctionne parce que deux dimensions de types float[M][2] peut convertir en float (*)[2]. Ils sont compatibles pour toute valeur de M.

En règle générale, Type[M][N] peut convertir en Type (*)[N] pour toute valeur entière non négative de M et N.

1

La façon dont vous faites cela n'est pas légitime en C++. Vous devez avoir un tableau de pointeurs.

1

Le problème ici est que les dimensions de b ne sont pas connues du compilateur. L'information est perdue lorsque vous lancez a1 sur un flotteur **. La conversion elle-même est toujours valide, mais vous ne pouvez pas référencer le tableau avec b [] [].

+0

+1 Je crois que c'est la raison pour laquelle vous ne pouvez pas utiliser des indices de tableau sur le flotteur * *. – Lou

0

Vous pouvez le faire explicitement:

float a1[2][2] = { {0,1},{2,3}}; 
float* fp[2] = { a1[0], a1[1] }; 
// Or 
float (*fp)[2] = a1; 
0

Essayez d'attribuer b à être égaux directement à a1, c'est à dire que le pointeur b pointe vers le même emplacement mémoire que pointeur a1 pointe du doigt, ils portent la même référence de mémoire maintenant, et vous devriez être capable de marcher à travers le tableau.

2

Si tous vos tableaux auront la dimension finale 2 (comme dans vos exemples), alors vous pouvez faire

float (*b)[2] = a1; // Or a2 or a3 
Questions connexes