使用指针进行多维数组

时间:2014-11-03 22:01:25

标签: c++ arrays pointers multidimensional-array

我有一个指向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来表示我能够遍历

的想法

2 个答案:

答案 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