Как динамически выделить 3D-массив в C ++

Опубликовано: 30 Ноября, 2021

Предварительное условие: основы работы с массивами
В C / C ++ - многомерные массивы простыми словами как массив массивов. Данные в многомерных массивах хранятся в табличной форме (в порядке возрастания строк). Ниже представлена общая форма объявления N-мерных массивов :

Синтаксис многомерного массива :

data_type  array_name[size1][size2]….[sizeN];

data_type: Type of data to be stored in the array. 
Here data_type is valid C/C++ data type
array_name: Name of the array
size1, size2, …, sizeN: Sizes of the dimensions

Трехмерные массивы - это массивы двумерных массивов :

Синтаксис 3D-массива:

data_type array_name[x][y][z];
data_type: Type of data to be stored. Valid C/C++ data type.

Дополнительные сведения о многомерных и трехмерных массивах см. В статье «Многомерные массивы в C ++».

Проблема : учитывая трехмерный массив, задача состоит в том, чтобы динамически выделить память для трехмерного массива, используя новые возможности C ++.

Решение. В следующих методах используется подход к созданию двух двумерных массивов, и каждый двумерный массив имеет 3 строки и 4 столбца со следующими значениями.

 1 2 3 4
5 6 7 8
9 10 11 12

13 14 15 16
17 18 19 20
21 22 23 24

X = No of 2D arrays.
Y = No of rows of each 2D array.
Z = No of columns of each 2D array.

Метод 1: использование одного указателя - в этом методе выделяется блок памяти размером x * y * z, а затем доступ к блокам памяти осуществляется с использованием арифметики указателя. Ниже представлена программа для того же:

C ++

// C++ program to dynamically allocate
// the memory for 3D array in C++
// using new operator
#include <iostream>
using namespace std;
// Driver Code
int main()
{
// Dimensions of the 3D array
int x = 2, y = 3, z = 4;
int count = 0;
// Allocate memory blocks
// of size x*y*z
int * a = new int [x * y * z];
// Traverse the 3D array
for ( int i = 0; i < x; i++) {
for ( int j = 0; j < y; j++) {
for ( int k = 0; k < z; k++) {
// Assign values to the
// memory blocks created
*(a + i * y * z + j * z + k) = ++count;
}
}
}
// Traverse the 3D array again
for ( int i = 0; i < x; i++) {
for ( int j = 0; j < y; j++) {
for ( int k = 0; k < z; k++) {
// Print values of the
// memory blocks created
cout << *(a + i * y * z + j * z + k) << " " ;
}
cout << endl;
}
cout << endl;
}
// Deallocate memory
delete [] a;
return 0;
}
Выход:

1 2 3 4 
5 6 7 8 
9 10 11 12 

13 14 15 16 
17 18 19 20 
21 22 23 24