将指针用于多实例数组



我有一个指向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)

最新更新