C++三维数组的动态申请

我想动态申请一个三维数组,但是一定要使得存储的空间连续的,方便管理,不知道各位有什么看法。
有个一二维的例子可以参考:
A **ga= new A* [m];
ga[0] = new A [m*n];
for(int i=1;i<m;++i)
{
ga[i]=ga[i-1]+n;
}
那么这样的内存便是一整块方便管理的了,那么三维情况又如何呢?

申请一维数组,构造3维数组的指针来访问

申请一维数组,构造3维数组的指针来访问

//多维数组开空间
#if 1
#include
#include

void print3Dmatrix(int D3_num,int n,int m, int l) //以D3_num形式将D3_num的首地址传入
{
int i,ii,iii;
printf("\n3D matrix is: \n");
for (i=0;i<n;i++){
printf("[]\n",i);
for (ii=0;ii<m;ii++){

        for (iii=0;iii<l;iii++){
            printf("%.3d ",D3_num[i][ii][iii]);
        }
        printf("\n");
    }
}

}

int **D3ToD2(int ***D3_num) //int **表示返回的是一个二级指针
{
int **D2_num;
D2_num=D3_num[0];//D3_num是一个三级指针,D3num[0]是一个二级指针,D3num[0][0]是一个一级指针
return D2_num;
}

void print2Dmatrix(int **D2_num,int m, int l)
{
int ii,iii;
printf("\n2D matrix is:\n");
for (ii=0;ii<m;ii++){

        for (iii=0;iii<l;iii++){
            printf("%.3d ",D2_num[ii][iii]);
        }
        printf("\n");
    }

}

int main()
{
int i,ii,iii;//初始化参数
int n=2,m=3,l=4; //三维数组长度

int ***D3_num;    //声明一个三级指针
D3_num=(int***)malloc(n*sizeof(int**));    //分配空间,该三级指针指向n个二级指针
for (i=0;i<n;i++){
    D3_num[i]=(int**)malloc(m*sizeof(int*));//分配空间,每个二级指针又指向m个一级指针
    for (ii=0;ii<m;ii++){
        D3_num[i][ii]=(int*)malloc(l*sizeof(int));//分配空间,每个一级指针指向长度为l的一维数组
        for (iii=0;iii<l;iii++){
            D3_num[i][ii][iii]=(i+1)*(ii+2)*(iii+3);//为每个数组赋值,这里D3_num[i][ii][iii]的形式与我们平常用三维数组的形式一致
            //但实际D3_num[i][ii][iii]是一种简写,C编译器解释起来是 *(*(*(p+i)+ii)+iii),所以可以直接赋值
        }            
    }
}

print3Dmatrix(D3_num,n,m,l);//输出D3_num内容,这里直接将D3_num作为三级指针输入

int **D2_num; //三级指针可以表示三维数组,二级指针自然就表示二维数组了:D
D2_num=D3ToD2(D3_num);//D3ToD2返回一个二级指针,与D2_num匹配

print2Dmatrix(D2_num,m,l);
getchar();
return 0;

}
#endif

建议看下我这个例子。

//多维数组开空间
#if 1
#include
#include

void print3Dmatrix(int D3_num,int n,int m, int l) //以D3_num形式将D3_num的首地址传入
{
int i,ii,iii;
printf("\n3D matrix is: \n");
for (i=0;i<n;i++){
printf("[]\n",i);
for (ii=0;ii<m;ii++){

        for (iii=0;iii<l;iii++){
            printf("%.3d ",D3_num[i][ii][iii]);
        }
        printf("\n");
    }
}

}

int **D3ToD2(int ***D3_num) //int **表示返回的是一个二级指针
{
int **D2_num;
D2_num=D3_num[0];//D3_num是一个三级指针,D3num[0]是一个二级指针,D3num[0][0]是一个一级指针
return D2_num;
}

void print2Dmatrix(int **D2_num,int m, int l)
{
int ii,iii;
printf("\n2D matrix is:\n");
for (ii=0;ii<m;ii++){

        for (iii=0;iii<l;iii++){
            printf("%.3d ",D2_num[ii][iii]);
        }
        printf("\n");
    }

}

int main()
{
int i,ii,iii;//初始化参数
int n=2,m=3,l=4; //三维数组长度

int ***D3_num;    //声明一个三级指针
D3_num=(int***)malloc(n*sizeof(int**));    //分配空间,该三级指针指向n个二级指针
for (i=0;i<n;i++){
    D3_num[i]=(int**)malloc(m*sizeof(int*));//分配空间,每个二级指针又指向m个一级指针
    for (ii=0;ii<m;ii++){
        D3_num[i][ii]=(int*)malloc(l*sizeof(int));//分配空间,每个一级指针指向长度为l的一维数组
        for (iii=0;iii<l;iii++){
            D3_num[i][ii][iii]=(i+1)*(ii+2)*(iii+3);//为每个数组赋值,这里D3_num[i][ii][iii]的形式与我们平常用三维数组的形式一致
            //但实际D3_num[i][ii][iii]是一种简写,C编译器解释起来是 *(*(*(p+i)+ii)+iii),所以可以直接赋值
        }            
    }
}

print3Dmatrix(D3_num,n,m,l);//输出D3_num内容,这里直接将D3_num作为三级指针输入

int **D2_num; //三级指针可以表示三维数组,二级指针自然就表示二维数组了:D
D2_num=D3ToD2(D3_num);//D3ToD2返回一个二级指针,与D2_num匹配

print2Dmatrix(D2_num,m,l);
getchar();
return 0;

}
#endif

建议看下我这个例子。

申请内存块, 定义宏

 int m, n, l;      //  三维数组个数
byte*  arrTri = new byte[m * n * l];
#define arrTri_p(a, b, c) (arrTri + a*m + b*n + c)
for(int a = 0; a < n; a++)
for(int b = 0; b < m; b++)
for(int c = 0; c < l; c++)
   *arrTri_p(a, b, c) = 10;

....
上面有点失误
#define arrTri_p(a, b, c) (arrTri + a*n*l + b*l + c)

最好不要这么搞, 要是头被覆盖了, 这是很难受,问题很大的一件事情。

//构建3维矩阵 
double*** data3d;//k是最外层(Z),i次外层(y),j是内层(x) 
data3d =new double**[volume_depth];  
for(int k=0; k<volume_depth; k++)  
{  
&nb......
答案就在这里:动态申请三维数组
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。