通过指针从C中的4d数组访问元素

时间:2012-09-28 11:23:55

标签: c++ c arrays

我在向我的4d数组声明指针时遇到问题。

我已经宣布这样:

int matrix[7][4][5][5] =
{
  {/* Section 1 */
    {
      /* 1st */
      {0,0,1,0,0},
      {0,0,1,0,0},
      {0,0,1,0,0},
      {0,0,0,0,0},
      {0,0,0,1,0}
    },
    {
     /* 2nd */
      {0,0,0,0,0},
      {0,0,0,0,0},
      {1,0,0,1,1},
      {0,0,0,0,0},
      {0,0,0,0,0}
    },
    . . . 
  }/* End Section 1 */
}

我希望能够在评论/* 2nd */下方打印出2d数组中的元素。

我有一些代码循环遍历2d数组:

for(int i = 0; i < 5; i++)
  {
    for(int j=0; j<5; j++)
    {
      std::cout << " " << pMatrixPtr[i][j];
    }
    std::cout << "\n";
  }

但我的问题是 - 我不知道将pMatrixPtr设置为什么,或者它应该是什么类型(我的意思是指针的级别......应该是**?)。我没有尝试任何东西似乎编译,我认为这是因为我不完全了解涉及哪些类型。

任何人都可以解释如何通过指针访问4d数组,以及该指针应该指向什么?

3 个答案:

答案 0 :(得分:3)

如果要打印仅在注释/ 2nd /下的内容,则可以手动选择前两个数组块并应用最后两个块的循环,例如...

for(int i=0;i<5;i++)
{
   for(int j=0;j<5;j++)
   {
      std::cout<<" "<<matrix[7][1][i][j];
   }
   std::cout<<"\n";
}

使用指针会使其变得复杂。

答案 1 :(得分:3)

int (*pMatrixPointer)[5] = matrix[0][1];

pMatrixPointer设置为指向matrix中的第二个2D数组。然后,您将在上面的代码中使用它:

for(int i = 0; i < 5; i++)
{
  for(int j=0; j<5; j++)
  {
    std::cout << " " << pMatrixPtr[i][j];
  }
  std::cout << "\n";
}

为什么会这样:

在大多数情况下,数组类型的表达式将转换为指针类型的表达式,表达式的值将是数组中第一个元素的地址(对于C和C ++都是如此)。

表达式 matrix[0][1]的类型为“5元素阵列int”;根据上面的规则,表达式将转换为“指向int”(int (*)[5])的5个元素数组的类型,值为&matrix[0][1]

表达式a[i]相当于*(a + i);下标操作中存在隐式取消引用。因此pMatrix[i]相当于*(pMatrix + i),它产生的指针值与j进一步偏移,为*(*(pMatriux + i) + j)

答案 2 :(得分:1)

指向4D数组的指针不容易从头开始定义,我总是使用typedef来帮助:

  typedef int MATRIX_1D[5]; // 5 element array of int
  typedef int* MATRIX_1D_PTR; // pointer to int array
  typedef MATRIX_1D MATRIX_2D[5]; // 5 element array of 5 element array of int
  typedef MATRIX_1D* MATRIX_2D_PTR; // pointer to array of 5 element array of int
  typedef MATRIX_2D MATRIX_3D[4]; // 4 el. arr. of 5 el. arr. of 5 el. arr. of int
  typedef MATRIX_2D* MATRIX_3D_PTR; // pointer to arr. of 5 el. arr. of 5 el. ...
  typedef MATRIX_3D MATRIX_4D[7]; // 7 el. arr. of 4 el. arr. of 5 el. arr. of 5...
  typedef MATRIX_3D* MATRIX_4D_PTR; // pointer to array of 4 element array of ... 

所以对你的情况来说:

MATRIX_2D_PTR pMatrixPtr = matrix[0][0];    
for(int i = 0; i < 5; i++)
  {
    for(int j=0; j<5; j++)
    {
      std::cout << " " << pMatrixPtr[i][j];
    }
    std::cout << "\n";
  }

正如您所看到的,pMatrixPtr是指向5类int类型数组的数组的指针。这就是我如何定义MATRIX_2D_PTR类型。

作为奖励答案 - 如何迭代整个矩阵的方式:

  void printMatrix(MATRIX_4D_PTR* p)
  {
    for (int i1 = 0; i1 < 7; ++i1)
     for (int i2 = 0; i2 < 4; ++i2)
      for (int i3 = 0; i3 < 5; ++i3)
       for (int i4 = 0; i4 < 5; ++i4)
        std::cout << p[i1][i2][i3][i4] << std::endl;
  }
  int main() { printMatrix(matrix); }