1

我在声明指向我的 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 */

我有一些代码可以像这样循环遍历二维数组:

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

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

谁能解释如何通过指针访问 4d 数组,以及该指针应该指向什么?

4

3 回答 3

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";
}

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

于 2012-09-28T11:39:08.357 回答
3
int (*pMatrixPointer)[5] = matrix[0][1];

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

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 元素数组的 5 元素数组int”;根据上面的规则,表达式被转换为类型“指向 5 元素数组的指针int” ( int (*)[5]) 并且值为&matrix[0][1].

表达式a[i]等价于*(a + i); 下标操作中有一个隐式取消引用。SopMatrix[i]等价于*(pMatrix + i),它产生一个指针值,我们用j, as进一步偏移*(*(pMatriux + i) + j)

于 2012-09-28T11:55:43.003 回答
1

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

  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); }
于 2012-09-28T11:49:54.030 回答