问题描述
- 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("
3D matrix is:
");
for (i=0;i<n;i++){
printf("[]
",i);
for (ii=0;ii<m;ii++){
for (iii=0;iii<l;iii++){
printf("%.3d ",D3_num[i][ii][iii]);
}
printf("
");
}
}
}
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("
2D matrix is:
");
for (ii=0;ii<m;ii++){
for (iii=0;iii<l;iii++){
printf("%.3d ",D2_num[ii][iii]);
}
printf("
");
}
}
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("
3D matrix is:
");
for (i=0;i<n;i++){
printf("[]
",i);
for (ii=0;ii<m;ii++){
for (iii=0;iii<l;iii++){
printf("%.3d ",D3_num[i][ii][iii]);
}
printf("
");
}
}
}
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("
2D matrix is:
");
for (ii=0;ii<m;ii++){
for (iii=0;iii<l;iii++){
printf("%.3d ",D2_num[ii][iii]);
}
printf("
");
}
}
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......
答案就在这里:动态申请三维数组