Лично я предпочитаю использовать синтаксический трюк для объявления указателя на динамический размерный многомерный массив.Это работает в компиляторах, которые поддерживают массивы переменной длины (VLA), что должны делать все компиляторы C ++, и в большинстве современных компиляторов C.
Основная идея описана в этом:"указывает на (непрерывный) блок пространства, который вы хотите рассматривать как многомерный массив.«A» имеет то же значение, что и «p», но объявление заставляет компилятор обрабатывать ссылки на «A» многомерным способом.Например:
#include <iostream>
using namespace std;
void bar (int *p, int nz, int ny, int nx)
{
int (*A)[ny][nx] = (int(*)[ny][nx]) p;
for (int ii = 0; ii < nz; ii++) {
for (int jj = 0; jj < ny; jj++) {
for(int kk = 0; kk < nx; kk++) {
A[ii][jj][kk] = ii*1000000 + jj*1000 + kk;
}
}
}
}
void out (int *p, int nz, int ny, int nx)
{
int (*A)[ny][nx] = (int(*)[ny][nx]) p;
cout << A[11][22][33] << endl;
}
int main (void)
{
int NX = 97;
int NY = 92;
int NZ = 20;
int *space = new int [NZ * NY * NX];
bar (space, NZ, NY, NX);
out (space, NZ, NY, NX);
return 0;
}
Выполнение этого приводит к выводу "11022033"
Объявление псевдонима "A" выглядит немного странно, но позволяет вам напрямую и просто использоватьжелаемый синтаксис многомерного массива