就个人而言,我的偏好是使用语法技巧来声明指向动态大小的多维数组的指针。这适用于支持可变长度数组 (VLA) 的编译器(所有 C++ 编译器都应该),以及大多数当前的 C 编译器。
基本思想体现在:
void bar (int *p, int nz, int ny, int nx) {
int (*A)[ny][nx] = (int(*)[ny][nx]) p;
"p" 指向您希望将其视为多维数组的(连续)空间块。 “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”别名的声明看起来有点奇怪,但它允许您直接简单地使用所需的多维数组语法