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 */
}

コメントの下にある2d配列の要素を印刷できるようにしたいと思います/* 2nd */

次のような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配列にアクセスする方法と、そのポインタが何を指す必要があるかを誰かが説明できますか?

4

3 に答える 3

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

pMatrixPointerの 2 番目の 2D 配列を指すように設定され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」です。int上記の規則により、式は「( )の 5 要素配列へのポインタ」型に変換されint (*)[5]、値は&matrix[0][1].

式は;a[i]と同等です。*(a + i)添字操作に暗黙の逆参照があります。SopMatrix[i]は と同等であり、*(pMatrix + i)さらに でオフセットするポインター値を生成します。j*(*(pMatriux + i) + j)

于 2012-09-28T11:55:43.003 に答える
3

コメント / 2nd / の下にのみあるコンテンツを印刷する場合は、最初の 2 つの配列ブロックを手動で選択し、最後の 2 つのブロックにループを適用できます。

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 に答える
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、int型の5つの要素の配列の配列へのポインタです。これが私が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 に答える