C++: 配列の基礎
最終更新:2026-08-31
配列は同じ型の複数の値を1つの変数に格納する。単一の値を格納する変数とは異なり、配列は「値の並び」を格納できる。
1. 配列とは何か?
(1) 1.1 現実の例え
| 日常のシナリオ | プログラミングでの相当 |
|---|---|
| 本棚に本を並べる | 配列に要素を格納 |
| 本棚から3番目の本を取る | books[2]でアクセス |
| 本棚の本を数える | 配列をループ |
(2) 1.2 メモリ内の配列
配列の要素はメモリに連続して格納される。
TEXT
📖 参照専用
インデックス: [0] [1] [2] [3] [4]
値: 10 20 30 40 50
メモリアドレス: 1000 1004 1008 1012 1016
💡 ヒント: インデックスは0から始まる。5つの要素を持つ配列のインデックスは0〜4。
2. 配列の宣言と初期化
(1) 2.1 宣言
CPP
int scores[5]; // 5つの整数を格納する配列を宣言
(2) 2.2 初期化
CPP
int scores[5] = {90, 85, 78, 92, 88}; // 宣言と同時に初期化
int numbers[] = {1, 2, 3, 4, 5}; // サイズを省略可能(自動的に5になる)
int zeros[5] = {0}; // すべて0で初期化
3. 要素へのアクセス
CPP
#include <iostream>
int main() {
int scores[5] = {90, 85, 78, 92, 88};
std::cout << scores[0] << std::endl; // 90(最初の要素)
std::cout << scores[4] << std::endl; // 88(最後の要素)
scores[2] = 80; // 値を変更
return 0;
}
4. 配列とループ
(1) 4.1 forループ
CPP
#include <iostream>
int main() {
int scores[5] = {90, 85, 78, 92, 88};
for (int i = 0; i < 5; i++) {
std::cout << "scores[" << i << "] = " << scores[i] << std::endl;
}
return 0;
}
(2) 4.2 範囲forループ(C++11)
CPP
#include <iostream>
int main() {
int scores[] = {90, 85, 78, 92, 88};
for (int score : scores) {
std::cout << score << " ";
}
return 0;
}
5. 配列の制限
(1) 5.1 固定サイズ
配列のサイズはコンパイル時に決定する必要がある。
CPP
int size = 5;
int arr[size]; // ❌ エラー(一部のコンパイラでは動作するが標準ではない)
const int SIZE = 5;
int arr[SIZE]; // ✅ OK: 定数を使う
(2) 5.2 範囲外アクセス
CPP
int arr[5] = {1, 2, 3, 4, 5};
std::cout << arr[5]; // ❌ 未定義の動作(インデックスは0〜4)
⚠️ 注意: C++は範囲外アクセスをチェックしない。プログラムはクラッシュするか、間違ったデータを読み取る。
6. 配列を関数に渡す
配列は関数に渡されるとポインタに減衰する。
CPP
#include <iostream>
void printArray(int arr[], int size) { // または int* arr
for (int i = 0; i < size; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
int main() {
int numbers[] = {1, 2, 3, 4, 5};
printArray(numbers, 5);
return 0;
}
▶ サンプル 1:配列の合計を計算(難易度 ⭐)
CPP
#include <iostream>
int sum(int arr[], int size) {
int total = 0;
for (int i = 0; i < size; i++) {
total += arr[i];
}
return total;
}
int main() {
int numbers[] = {10, 20, 30, 40, 50};
int size = sizeof(numbers) / sizeof(numbers[0]);
std::cout << "合計: " << sum(numbers, size) << std::endl;
return 0;
}
▶ サンプル 2:最大値を探す(難易度 ⭐⭐)
CPP
#include <iostream>
int findMax(int arr[], int size) {
int max = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
int main() {
int numbers[] = {45, 23, 89, 12, 67};
int size = sizeof(numbers) / sizeof(numbers[0]);
std::cout << "最大値: " << findMax(numbers, size) << std::endl;
return 0;
}
▶ サンプル 3:配列内の特定値を検索(難易度 ⭐)
CPP
#include <iostream>
int search(int arr[], int size, int target) {
for (int i = 0; i < size; i++) {
if (arr[i] == target) {
return i; // 見つかったインデックスを返す
}
}
return -1; // 見つからない
}
int main() {
int numbers[] = {10, 25, 30, 45, 50};
int size = sizeof(numbers) / sizeof(numbers[0]);
int index = search(numbers, size, 30);
if (index != -1) {
std::cout << "30はインデックス" << index << "にあります" << std::endl;
} else {
std::cout << "見つかりません" << std::endl;
}
return 0;
}
❓ よくある質問
Q 配列のサイズを動的に変更できる?
A Cスタイル配列では不可。動的サイズが必要なら
std::vectorを使う(後のレッスンで解説)。Q 配列のサイズをどうやって取得?
A
sizeof(arr) / sizeof(arr[0])を使う。ただし配列がポインタに減衰した後は使えない。Q 配列のインデックスはなぜ0から始まる?
A 配列のインデックスはメモリオフセット。最初の要素のオフセットは0だから。
📖 まとめ
- 配列は同じ型の複数の値を格納
- インデックスは0から始まる
- サイズは固定で、コンパイル時に決定
- 範囲外アクセスは未定義の動作——注意
- 配列は関数に渡されるとポインタに減衰
- サイズ情報も一緒に渡す必要がある
📝 練習問題
-
初級(難易度 ⭐): 5つの整数を格納する配列を作成し、すべての要素を出力。
-
中級(難易度 ⭐⭐): 配列の平均値を計算する関数を書く。
-
上級(難易度 ⭐⭐⭐): 配列を逆順にする関数を書く。