C++: 多次元配列

最終更新:2026-08-31

多次元配列は「配列の配列」。2次元配列は表(行と列)、3次元配列は立方体のような構造を持つ。


1. 2次元配列とは何か?

(1) 1.1 現実の例え

日常のシナリオ プログラミングでの相当
チェスボード 8x8の2次元配列
成績表 学生×科目の表
画像のピクセル 幅×高さの配列

(2) 1.2 メモリ内の2次元配列

2次元配列はメモリに行優先で格納される:

TEXT 📖 参照専用
行列:     [0][0] [0][1] [0][2]
          [1][0] [1][1] [1][2]
          
メモリ:   [0][0], [0][1], [0][2], [1][0], [1][1], [1][2]


2. 宣言と初期化

(1) 2.1 宣言

CPP
int matrix[3][4]; // 3行4列の2次元配列

(2) 2.2 初期化

CPP
int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

int identity[3][3] = {
    {1, 0, 0},
    {0, 1, 0},
    {0, 0, 1}
};


3. 要素へのアクセス

CPP
#include <iostream>

int main() {
    int matrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    
    std::cout << matrix[0][0] << std::endl; // 1
    std::cout << matrix[1][2] << std::endl; // 6
    
    matrix[0][1] = 10; // 値を変更
    
    return 0;
}


4. ネストしたループ

(1) 4.1 全要素を出力

CPP
#include <iostream>

int main() {
    int matrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }
    
    return 0;
}


5. 3次元配列

CPP
int cube[2][3][4]; // 2x3x4の3次元配列
💡 ヒント: 3次元以上の配列は複雑になる。必要がない限り避ける。


▶ サンプル 1:行列の和(難易度 ⭐)

CPP
#include <iostream>

int main() {
    int A[2][2] = {{1, 2}, {3, 4}};
    int B[2][2] = {{5, 6}, {7, 8}};
    int C[2][2];
    
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            C[i][j] = A[i][j] + B[i][j];
        }
    }
    
    std::cout << "行列の和:" << std::endl;
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            std::cout << C[i][j] << " ";
        }
        std::cout << std::endl;
    }
    
    return 0;
}
▶ 試してみよう

▶ サンプル 2:グリッドを表示(難易度 ⭐⭐)

CPP
#include <iostream>

int main() {
    char grid[5][5];
    
    // グリッドを初期化
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            grid[i][j] = '.';
        }
    }
    
    // 対角線を描画
    for (int i = 0; i < 5; i++) {
        grid[i][i] = 'X';
    }
    
    // グリッドを表示
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            std::cout << grid[i][j] << " ";
        }
        std::cout << std::endl;
    }
    
    return 0;
}
▶ 試してみよう

▶ サンプル 3:行列の転置(難易度 ⭐⭐)

CPP
#include <iostream>

int main() {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int transposed[3][2];
    
    // 転置
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            transposed[j][i] = matrix[i][j];
        }
    }
    
    std::cout << "転置行列:" << std::endl;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
            std::cout << transposed[i][j] << " ";
        }
        std::cout << std::endl;
    }
    
    return 0;
}
▶ 試してみよう

❓ よくある質問

Q 2次元配列のサイズは動的に決められる?
A 標準C++では不可。動的サイズが必要ならstd::vector<std::vector<T>>を使う。
Q 多次元配列を関数に渡す方法は?
A 2次元以上の次元サイズを指定する必要がある:void func(int arr[][3], int rows)
Q メモリのオーバーヘッドはある?
A Cスタイル配列にはオーバーヘッドがない。連続したメモリブロックとして格納される。

📖 まとめ


📝 練習問題

  1. 初級(難易度 ⭐): 3x3の行列を作成し、対角要素のみを出力。

  2. 中級(難易度 ⭐⭐): 2つの行列の積を計算するプログラムを書く。

  3. 上級(難易度 ⭐⭐⭐): シンプルな迷路ゲームを作成:2次元配列で迷路を表現し、プレイヤーが移動できるようにする。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%