c++primerの多次元配列


多次元配列は厳密にはC++言語には配列が多くなく、通常言う配列は実は配列の配列である.これを覚えておくと、多次元配列の理解と使用に大きなメリットがあります.1つの配列の要素が1つの配列である場合、通常は2つの次元を使用して定義されます.1つの次元は配列自体のサイズを表し、もう1つの次元はその要素(配列)のサイズを表します.
int ia[3][4]; //    3   ,       4      
//    10   ,           20   ,
//           30      。
int arr[10][20][30] = {0};  //          0。

多次元配列の初期化
 :
int ia[3][4] = {    // 3   ,         4   。
 {0,1,2,3}, //        
 {4,5,6,7}, //        
 {8,9,10,11} //        
};

内側にネストされたカッコは必要ありません.
  :
//           ,             。
int ia[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

すべての要素の値が初期化リストに含まれる必要はありません.
//             
int ia[3][4] = {{0},{4},{8}};

//          ,          
int ia[3][4] = {0,3,6,9};

多次元配列の下付き参照
//  arr     ia             
ia[2][3] = arr[0][0][0];
int (&row)[4] = ia[1];  // row   ia    4     

プログラムでは、多次元配列の要素を処理するために、ネストされたforループを2層使用することがよくあります.
constexpr  size_t  rowCnt = 3, colCnt = 4;
int ia[rowCnt][colCnt];  // 12        
//      
for(size_t i=0; i!=rowCnt; ++i)
{
 //         
 for(size_t j=0; j!=colCnt; ++j)
 //              
 ia[i][j] = i*colCnt +j;
}

範囲for文を使用して多次元配列を処理する前のプログラムは、次のように簡略化できます.
size_t cnt = 0;
for(auto &row : ia)
{
       for(auto &col : row)
       {
            col = cnt;
            ++cnt;
       }
}

注意:範囲for文を使用して多次元配列を処理するには、最外層のループを除いて、他のすべてのループの制御変数が参照タイプである必要があります.
ポインタと多次元配列
多次元配列を指すポインタを定義するときは、この多次元配列が実際に配列の配列であることを忘れないでください.多次元配列は配列の配列であるため、多次元配列名から変換されたポインタは、実際には最初の内層配列を指すポインタである:int ia[3][4];//サイズ3の配列で、各要素は4つの整数を含む配列int(*p)[4]=ia;pは4つの整数を含む配列p=&ia[2];//pはiaの末尾要素を指す.