2011-08-10 19 views
1

ポインタを2次元配列に割り当てる方法を教えてください。2次元配列へのポインタ

次のコードは機能しません。

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; 

答えて

4

a1float**に変換できません。あなたがやっていることは違法で、望みの結果を生むことはありません。

これを試してみてください:

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

タイプfloat[M][2]の2次元配列がfloat (*)[2]に変換することができますので、これは動作します。彼らはMの任意の値と互換性があります。

一般的に、Type[M][N]は、負の整数値MNの場合、Type (*)[N]に変換できます。

1

これを行う方法は、C++では正当ではありません。あなたはポインタの配列を持つ必要があります。

1

ここでの問題は、bの寸法がコンパイラに知られていないことです。 a1をfloat **にキャストすると情報が失われます。変換自体はまだ有効ですが、b [] []で配列を参照することはできません。

+0

+1を行うことができます* *。 – Lou

0

あなたは明示的にそれを行うことができます。

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

bは直接A1に等しいことを割り当てる試し、それがポインタbはポインタa1が指している同じメモリ位置を指していることを意味しています、彼らが運びます今度は同じメモリ参照を使用して、配列内を移動できるはずです。

2

すべての配列は(あなたの例のように)最終寸法2を持つことになります場合は、あなたが、私は、これはあなたがフロートの上に配列インデックスを使用できない理由であると考えている

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