🇯🇵 日本語 | 🇺🇸 English

C言語 多次元配列

2次元配列の基本とネストした要素アクセス、3次元以降の考え方まで。配列の基礎を終えた人向け。

多次元配列とは ― 表・立体でデータを並べる

1次元配列が「1列の並び」なら、2次元配列は行と列を持つ表(マス目)です。型 名前[行数][列数]; で宣言します。

2次元配列のイメージ(3行 × 4列)

int a[3][4];   // 3行 × 4列 = 12個の int
1
2
3
4
5
6
7
8
9
10
11
12
青=0行目 緑=1行目(オレンジ=a[1][2]) 赤=2行目
a[行][列] の順でアクセスし、行も列も0始まりa[1][2] は「2行目の3列目」= 7 です。

ネストした for で全要素にアクセス

for (int i = 0; i < 3; i++)        // 外側 = 行
    for (int j = 0; j < 4; j++)    // 内側 = 列
        printf("%d ", a[i][j]);
⚠️ i と j を逆にすると別の要素になります。a[j][i] は行と列が入れ替わった全く違うアクセス。「外側が行・内側が列」と決めておくと混乱しません。

3次元以降 ― 次元を足すだけ

int cube[2][3][4];   // 2層 × 3行 × 4列(立体的なイメージ)
cube[][][]

// 全走査は for を3重に:
for (int l = 0; l < 2; l++)
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 4; j++)
        cube[l][i][j] = 0;
次元が1つ増えるごとに、添字も for ループも1つずつ増えるのが基本です。4次元・5次元も同じ考え方ですが、実務で使うのは主に2〜3次元です。より詳しい宣言・初期化の書き方は、次のセクションで確認しましょう。

2次元・3次元の宣言と初期化

2次元配列

// 3行×4列
int m[3][4] = {
    { 1,  2,  3,  4},
    { 5,  6,  7,  8},
    { 9, 10, 11, 12}
};

printf("%d\n", m[1][2]);  // → 7 (1行目の2列目、0起点)

3次元配列

// 2層×3行×4列(立体的なイメージ)
int cube[2][3][4];

for (int l = 0; l < 2; l++)
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 4; j++)
            cube[l][i][j] = l * 100 + i * 10 + j;
初期化の省略: int m[3][4] = {0}; と書けば全要素0に初期化。int m[][4] = {{1,2,3,4},{5,6,7,8}};外側の次元だけ省略可能(列数は必須)。

sizeof の確認

int m[3][4];
sizeof(m)        // 48  (3 * 4 * 4バイト)
sizeof(m[0])     // 16  (1行分 = 4 * 4バイト)
sizeof(m[0][0])  // 4   (intひとつ)
// 要素数を求めるイディオム:
//   行数 = sizeof(m) / sizeof(m[0])
//   列数 = sizeof(m[0]) / sizeof(m[0][0])

自分で書いてみよう ― 多次元配列

2次元・3次元配列を、宣言とネストした for ループで動かしてみましょう。
課題1: 九九の表
int table[9][9] に九九を入れて出力せよ。table[i][j] = (i+1) * (j+1) をネストした for で埋める。
課題2: 行ごとの合計
int a[3][4] を適当な値で初期化し、各行の合計を求めて表示せよ(外側=行、内側=列でループ)。
課題3: 転置(行と列の入れ替え)
int A[3][4] から int B[4][3] を作り、B[j][i] = A[i][j] で行と列を入れ替えて表示せよ。

間違えたら戻るページ

確認クイズ

この講座の理解度をチェックしましょう!

Q1. int a[3][4]; で a[1][2] はどの位置の値?

2行目の3列目(行も列も0始まり)
1行目の2列目
3行目の4列目

a[行][列] で行も列も0始まり。a[1] は2行目、[2] は3列目を指します。

Q2. int a[3][4] の全要素を走査する正しいループは?

for(i=0;i<3;i++) for(j=0;j<4;j++) a[i][j]
for(i=0;i<4;i++) for(j=0;j<3;j++) a[i][j]
for(i=0;i<7;i++) a[i]

外側=行(0〜2)、内側=列(0〜3)。行数と列数を取り違えないこと。i と j を逆にすると別の要素になります。

Q3. int cube[2][3][4]; の要素数は?

24個(2 × 3 × 4)
9個(2 + 3 + 4)
12個

多次元配列の要素数は各次元の積。2 × 3 × 4 = 24個の int です。

関連する講座

基礎
第20回 配列
配列の添字、初期化、範囲外アクセスを復習できます。
発展編
第35回 ポインタの基礎
配列とポインタ、アドレス計算の理解を固められます。
発展編
第41回 動的メモリ(malloc/free)
実行時サイズの配列を安全に確保・解放する基本を確認できます。
← 前の講座
第24回 確認問題(文字列)
次の講座 →
第26回 関数(基本)