我有一个指向4维数组的指针;我想用它来为4维数组赋值。
我所知道的是创建一个 4 维数组并使用指向浮点的指针遍历它
float dArray [2][3][4][5];
float *ptr = &dArray[0][0][0][0];
我正在努力解决的是如果我有指向 4D 数组的指针
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];
错误:"="标记之前的预期构造函数、析构函数或类型转换
不用说,一只新蜜蜂正在学习艺术:)
编辑 - 使用双倍来表示我能够遍历的想法的错别字
首先,按照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++;
关键是维度为 [DIM0][DIM1][DIM2][DIM3] 的数组是一个连续空间在内存中保存"DIM0 次包含的块" "DIM1 次包含的块" "DIM2 次包含的块" "DIM3 次浮点数">
例如,以下代码给出相同的结果:
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++;
甚至更好:
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++;
希望这个回答你的问题,祝你晚安,斯特凡诺
这个...
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));
。之后,您可以像处理dArray
一样处理pointerArray4D
。 (但不要忘记在完成它时free(pointerArray4D)
。