2017-01-12 7 views
1

Следующая программа преобразует трехмерный массив в массив 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

BTW, ваши массивы 'p' и' c' являются массивами указателей. Это намеренно? –

+0

Чтобы преобразовать многомерные массивы в массив 1d или 2d, мы должны использовать указатели. Это увеличивает скорость, поскольку арифметика указателя часто быстрее, чем индексация массива. – steve

+0

Можете ли вы * доказать *, что арифметика указателя быстрее, чем индексирование массива? Многие инструкции процессора могут загружать данные с использованием индекса намного быстрее, чем использование арифметики указателя. Некоторые процессоры могут выполнять загрузку из памяти через указатель и смещение в одной инструкции. Я не вижу, как использование указателей происходит быстрее. –

ответ

2

Один из способов - использовать вложенные петли 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]; 
    } 
    } 
} 

Примечание: в приведенном выше примере не было указаний и не было нанесено ущерба.

Смежные вопросы