通过指针访问三维数组

时间:2013-07-02 08:12:45

标签: c++ c arrays pointers

如何通过指针访问三维数组?目前我有这个代码,试图得到相同的结果。我需要通过指针访问以使用OpenCL中数组中的值。

for (l = 0; l < NumberOfLayers - 1; l++) {
  for (i = 0; i < NeuronsPerLayer[l]; i++) {
    for (j = 0; j < NeuronsPerLayer[l + 1] - bias[l + 1]; j++) {
      cout<<Synweights[l][i][j]<<endl;  
      cout<<*(*Synweights[0]+l*NumberOfLayers + i * NeuronsPerLayer[l] + j)<<endl;
    }
  }
}

Synweights声明为:

double ***Synweights
Synweights = (double ** *)malloc((NumberOfLayers - 1) * sizeof(double **));
for (l = 0; l < NumberOfLayers - 1; l++) {
    Synweights[l] = (double **)malloc(NeuronsPerLayer[l] * sizeof(double *));
    for (i = 0; i < NeuronsPerLayer[l]; i++) {
        Synweights[l][i] = (double *)malloc((NeuronsPerLayer[l + 1] - bias[l + 1]) * sizeof(double));
    }
}

2 个答案:

答案 0 :(得分:2)

这取决于数组的结构。

Synweights是一个数组数组,这意味着在不同的位置有许多内存块。如果你有一个指向这种结构的指针,你可以使用指针执行相同的操作:

float p*** = new float**[sizeL];
for(int l=0; l<sizeL; ++l)
{
    p[l] = new float*[sizeI];
    for(int i=0; i<sizeI; ++i)
        p[l][i] = new float[sizeJ];
}

...
    p[l][i][j] = 0; // Access

如果您只是在内存块上被解释为3D数组,则需要进行一些算术运算。无论如何,这应该是您需要CpenCL的情况。

float* p = new float[sizeL*sizeI*sizeJ];

...
    p[(l*sizeI+i)*sizeJ+j] = 0; // Access
    p + ((l*sizeI+i)*sizeJ+j);  // Direct address/pointer calculation

由于缓存性能和较少的地址计算,此变体更快。如果您打算多次访问,可以存储计算的索引。

答案 1 :(得分:0)

可以通过以下方式访问三维数组;

T* myArray = new T[3][4][5];
T* aParticularT = myArray[1][2][2];
T* anArrayOfTs = myArray[1][2];
T* aTwoDimensionalArrayOfTs = myArray[1];
T* aThreeDimensionalArrayOfTs = myArray;
aTypeName aMemberOfT = aParticularT->memberName;