2014-11-03 108 views
0

我有一个指向4维数组的指针;我想用它来为4维数组赋值。使用多指针数组指针

我知道什么是创建一个4维数组并使用指针浮

float dArray [2][3][4][5]; 
float *ptr = &dArray[0][0][0][0]; 

通过它遍历什么,我挣扎是,如果我有指针4dimensional阵列

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]; 

错误:期望的构造函数,析构函数或类型转换在'='标记之前

不用多说了新的蜜蜂学习艺术的:)

编辑 - 采用双层代表我能够穿越

回答

0

这个的想法的错字......

double dArray [2][3][4][5]; 

...声明一个数组。有与其关联的2 * 3 * 4 * 5 double的存储空间。

这...

float ***pointerArray4D[]; 

...宣称的float ***未指定长度,它是实际上在所有法律(即,在文件范围内)的数组。这实际上与float ****相同。除非您分配一些存储空间,否则没有关联的存储空间用于实际的任何float。此外,您分配给pointerArray4D的空间预计将保留float ***(根据其声明)的值。你可以用这个工作,但你必须执行四个级别的分配。

假设DIM0 - DIM3是预处理宏,你也许希望这样的事情,而不是:

float (*pointerArray4D)[DIM1][DIM2][DIM3]; 

pointerArray4D = malloc(DIM0 * sizeof(*pointerArray4D)); 

...之后就可以处理pointerArray4D完全一样,你会做dArray。 (但是,当你完成它时,不要忘记free(pointerArray4D)。)

+0

注意,这个答案假定C,这是不一样的东西C++。 – 2014-11-03 22:20:53

+0

'float *** pointerArray4D [];'不声明'float ****'。在C++中它是非法的。在C中它在文件范围内是合法的,并且是'float ***'数组的临时定义,但是OP似乎总是在块范围内使用它。 – 2014-11-03 22:57:01

+0

@MattMcNabb,我确实已经注意到我的答案属于C而不是C++。关于C,cdecl调用'float *** pointerArray4D []''float *'的一个*数组*的声明,其衰变为'float ****',而不是'float ***'。我承认在那里存在一些不精确的地方,但是对于大多数意图和目的,'float ****'可以代替'float *** pointerArray4D []'在任何后者被允许的地方使用。 – 2014-11-03 23:18:48

0

首先,user3353819的提示如下:

think of double array[a][b][c][d] as simply an array of doubles of length a * b * c * d. This means you would find the first element with &array which is of type 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倍浮法”

作为esemplification下面的代码给出相同的结果的块:

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++; 

希望这回答您的问题,有一个美好的夜晚,斯特凡诺

+0

@MattMcNabb,'fArray [0] [0] [0] [0];'是一个float,'&fArray [0] [0] [0] [0];'是一个'float' 。它编译。 – 2014-11-03 23:08:05

+0

对不起,我误读了 – 2014-11-03 23:12:12