我有一个指向4维数组的指针;我想用它来为4维数组赋值。
我所知道的是创建一个4维数组并使用指针浮动遍历它
float dArray [2][3][4][5];
float *ptr = &dArray[0][0][0][0];
我正在努力的是,如果我有指向4维数组的指针
float ***pointerArray4D[];
并说我想用它来存储下面数组的值 - 我该怎么做。
value = 0;
for (int ix0 = 0; ix0 < DIM0; ++ix0)
for (int ix1 = 0; ix1 < DIM1; ++ix1)
for (int ix2 = 0; ix2 < DIM2; ++ix2)
for (int ix3 = 0; ix3 < DIM3; ++ix3)
pointerArray4D[ix0][ix1][ix2][ix3] = float(value++);
我试图做的是
1)
float pointerArray4D_1[2][3][4][5];
float ***pointerArray4D[5];
pointerArray4D = pointerArray4D_1;
2)我认为我应该做的其他事情是为它分配记忆
pointerArray4D=new float*[2];
for(int i=0; i<2; ++i)
pointerArray4D[i]=new float*[3];
for(int i=0; i<3; ++i)
pointerArray4D[i]=new float*[4];
for(int i=0; i<4; ++i)
pointerArray4D[i]=new float[5];
错误:在'='标记
之前的预期构造函数,析构函数或类型转换毋庸置疑,新蜜蜂学习艺术:)
已编辑 - 使用double来表示我能够遍历
的想法答案 0 :(得分:0)
这......
double dArray [2][3][4][5];
...声明一个数组。存储与2 * 3 * 4 * 5 double
s相关联。
这......
float ***pointerArray4D[];
...声明一个未指定长度float ***
的数组,其中它实际上是合法的(即在文件范围内)。这实际上与float ****
相同。除非您分配一些,否则任何实际的float
都没有相关的存储空间。此外,您为pointerArray4D
分配的空间应该包含float ***
类型的值(根据其声明)。你可以使用它,但你必须执行四个级别的分配。
假设DIM0
- DIM3
是预处理器宏,你可能想要这样的东西,而不是:
float (*pointerArray4D)[DIM1][DIM2][DIM3];
pointerArray4D = malloc(DIM0 * sizeof(*pointerArray4D));
...之后您可以完全按照pointerArray4D
处理dArray
。 (但是当你完成它时不要忘记free(pointerArray4D)
。)
答案 1 :(得分:0)
首先,按照user3353819的提示:
认为
的double array[a][b][c][d]
只是一组双打 长度a * b * c * d。这意味着你会找到第一个元素&array
类型为double*
float ***pointerArray4D[]; value = 0; for (int ix0 = 0; ix0 < DIM0; ++ix0) for (int ix1 = 0; ix1 < DIM1; ++ix1) for (int ix2 = 0; ix2 < DIM2; ++ix2) for (int ix3 = 0; ix3 < DIM3; ++ix3) pointerArray4D[ix0][ix1][ix2][ix3] = float(value++);
查看您的代码:
float fArray[DIM0][DIM1][DIM2][DIM3];
float *pointerArray = &fArray[0][0][0][0];
float fValue = 0;
for (int ix0 = 0; ix0 < DIM0; ++ix0)
for (int ix1 = 0; ix1 < DIM1; ++ix1)
for (int ix2 = 0; ix2 < DIM2; ++ix2)
for (int ix3 = 0; ix3 < DIM3; ++ix3)
pointerArray[ ix0*DIM1*DIM2*DIM3 + ix1*DIM2*DIM3 + ix2*DIM3 + ix3 ] = fValue++;
正确的做法是:
float fArray[DIM0][DIM1][DIM2][DIM3];
float *pointerArray = &fArray[0][0][0][0];
float fValue = 0;
for (int ix0 = 0; ix0 < DIM0; ++ix0)
for (int ix1 = 0; ix1 < DIM1; ++ix1)
for (int ix2 = 0; ix2 < DIM2; ++ix2)
for (int ix3 = 0; ix3 < DIM3; ++ix3)
*pointerArray++ = fValue++;
关键是尺寸为[DIM0] [DIM1] [DIM2] [DIM3]的阵列是contiguos空间 在内存中保存“DIM0乘以一个块包含”“DIM1乘以一个块包含”“DIM2乘以一个块包含”“DIM3乘以浮点数”
作为简化,以下代码给出了相同的结果:
float fArray[DIM0][DIM1][DIM2][DIM3];
float *pointerArray = &fArray[0][0][0][0];
float fValue = 0;
const int nElem = DIM0*DIM1*DIM2*DIM3;
for (int ix = nElem; ix>0; --ix)
*pointerArray++ = fValue++;
甚至更好:
{{1}}
希望您回答这个问题,请过个晚安,Stefano