2017-01-12 5 views
1

次のプログラムは、3Dアレイをポインタの助けを借りて1Dアレイに変換します。変換エラーが発生しています。エラーが来る行には、int型へのポインタを指すポインタを持つ代入演算子が両側に含まれています。3Dアレイから1Dアレイへの変換が失敗する

#include<iostream> 
using namespace std ; 
int main() 
{ 
// REPLACING 3D ARRAY WITH A 2D ARRAY AND THEN INTO A 1D ARRAY USING    POINTERS . 
int abc [2][2][3] ; 
int **p[3][2] ; 
int *c[6] ; 
//   // abc gives address of first element of 3d array ie first 2d array . 

// abcはint型へのポインタへのポインタへのポインタです。

int i , j ;  // * abc represents address of first 1d array of first 2d array . 
for (i=0 ; i<=2 ; i++) // *abc +1:address of second 1d array of first 2d 
{       // array . 
for (j=0 ; j<=1 ; j++) 
{ 
p[i][j] = *(abc+i) + j ; // conversion error comes here. 

} 
} 

for (i=0 ; i<=5 ; i++) 
{ 
for (j=0 ; j<=1 ; j++)  
{ 
c[i] = *p[i][j] ; 
} 

} 

// entering array elements . 
for (i=0 ; i<=5 ; i++) 
{ 
cin>>* c[i] ; 

} 

// required array elements . 
for (i=0 ;i<=5 ;i++) 
{ 
cout<<*c[i]<<" "; // 3d array elements are accessed using 1d array 
}              // of pointers . 
} 
+1

ところで、 'p'と' c'の配列はポインタの配列です。これは意図的ですか? –

+0

多次元配列を1d配列または2d配列に変換するには、ポインタを使用する必要があります。これは、ポインタの算術演算が配列の索引付けより速いことが多いため、速度が向上します。 – steve

+0

ポインタの算術演算が配列の索引付けより高速であることを証明できますか?多くのプロセッサ命令では、ポインタ演算を使用するよりも高速にインデックスを使用してデータをロードできます。いくつかのプロセッサは、1つの命令でポインタとオフセットを介してメモリからロードを実行できます。私はポインタの使用がどんなに速いのか分かりません。 –

答えて

2

1つの方法は、ネストされたforループを使用することです。

1Dアレイがであり、3Dスロットを格納するのに十分な大きさであることを確認してください。

int a[2][2][2]; 
int c[2 * 2 * 3]; 
unsigned int index = 0; 
for (unsigned int i = 0; i < 2; ++i) 
{ 
    for (unsigned int j = 0; j < 2; ++j) 
    { 
    for (unsigned int k = 0; k < 3; ++k) 
    { 
     c[index++] = a[i][j][k]; 
    } 
    } 
} 

注:上記の例では、ポインタは必要とされず、害されませんでした。

関連する問題