C++の配列
[前のレッスンでは]、[各]変数には[1つの]値しか格納できませんでした。
[でも、もし] 100 [人の生徒の成績] を保存したいとしたら、[100 [個の]変数]を宣言するわけには[いかない]でしょう?
配列[は、この問題を解決するものだ]――[連続した]メモリ[領域]であり、[同じ]型[のデータを]複数格納するために用いられる。
1. 配列とは何か?
(1) 1.1 [日常生活における]配列
| [生活シーン] | 番組[での対応] |
|---|---|
| [一列の郵便受け]([各郵便受けの番号が異なる]) | 配列([各要素の添字が異なる]) |
| [卵1パック](12 [個]、[番号] 1~12) | 配列(12 [要素]、[添字] 0~11) |
array[の特徴]:
- [すべての要素]のタイプが[同じ]([すべて]
int、[またはすべて]double) - メモリ[連続]([要素が隣り合わせ])
- [下付き番号は] 0 [から始まる]([1] [から始まる] わけではない!)
(2) 1.2 なぜ配列が必要なのか?
[不要]array([悪い例]):
▶ サンプル 2: [基礎プログラミングの実践] (難易度 ⭐)
#include iostream
int main() {
int score1 = 90;
int score2 = 85;
int score3 = 92;
// ... 100!
return 0;
}
[用法]array([良い例]):
#include iostream
int main() {
int scores[100]; // 100
// ...
for (int i = 0; i < 100; i++) {
scores[i] = 0;
}
return 0;
}
2. array[の]宣言と初期化
(1) 2.1 配列の宣言
[文法]:
;
例:
int scores[5]; // 5
double prices[10]; // 10
char letters[26]; // 26
💡 [重要]: array[の][インデックスは] 0 [から始まる]、[したがって] scores[5] [のインデックス範囲は] 0 [から] 4 までである(1 [から] 5 までではない)。
(2) 2.2 配列の初期化
[方法1]:[宣言時に初期化]
int scores[5] = {90, 85, 92, 78, 88};
[方法2]:[部分的な初期化]
int scores[5] = {90, 85}; //, 0
[方法3]:[コンパイラに]サイズを[推論させる]
int scores = {90, 85, 92, 78, 88}; // 5
💡 [ヒント]: [方法3の使用をお勧めします]。そうすれば、[後でarray[内容]を変更した場合でも]、[手動でサイズを変更する必要がありません]。
3. [アクセス]array[要素]
(1) 3.1 [要素の読み取り]
[文法]:
例:
#include iostream
int main() {
int scores[5] = {90, 85, 92, 78, 88};
std::cout << ":" << scores[0] << std::endl; // 90
std::cout << ":" << scores[2] << std::endl; // 92
std::cout << ":" << scores[4] << std::endl; // 88
return 0;
}
(2) 3.2 [要素の編集]
#include iostream
int main() {
int scores[5] = {90, 85, 92, 78, 88};
scores[1] = 95; // 95
std::cout << ":" << scores[1] << std::endl; // 95
return 0;
}
4. [配列の走査]
(1) 4.1 [用] forループ[反復処理]
#include iostream
int main() {
int scores[5] = {90, 85, 92, 78, 88};
std::cout << ":" << std::endl;
for (int i = 0; i < 5; i++) {
std::cout << "..." << i + 1 << ":" << scores[i] << std::endl;
}
return 0;
}
出力:
1:90
2:85
3:92
4:78
5:88
💡 [要点]: [配列]を[走査]する際、ループ条件は[通常] i < array[大小]であり、i <= array[大小] - 1ではない([そうするとミスが起きやすくなる])。
5. array[のサイズ]
(1) 5.1 [sizeof を使用して] [要素の数を計算する]
#include iostream
int main() {
int scores[5] = {90, 85, 92, 78, 88};
int size = sizeof(scores) / sizeof(scores[0]); // ...
std::cout << ":" << size << std::endl; // 5
return 0;
}
[原理]:
sizeof(scores)— [配列全体が]占めるバイト数(5 × 4 = 20 [バイト])sizeof(scores[0])— [1つの要素が占めるバイト数](4 [バイト])- [除算して要素の数を求める]
💡 [ヒント]: [この方法は][真の]配列にのみ適用され、[ポインタには適用されません]([後ほど学習します])。
6. array[として]function[引数]
(1) 6.1 [問題]:配列[はポインタに]退化してしまう
[arrayを]function[に渡すと]、arrayは[ポインタに][変換され]([サイズ情報が失われる])。
#include iostream
//,
void printArray(int arr, int size) {
for (int i = 0; i < size; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
int main() {
int scores[5] = {90, 85, 92, 78, 88};
printArray(scores, 5); // ()
return 0;
}
💡 [重要]: array[引数として渡す場合]、[サイズを別途指定する必要がある]。
7. [よくある]エラー
(1) 7.1 配列[インデックスオーバーフロー]
エラー例:
#include iostream
int main() {
int scores[5] = {90, 85, 92, 78, 88};
std::cout << scores[5] << std::endl; // ❌!max 4
return 0;
}
[結果]: [無意味なデータ]が読み込まれるか、[あるいは]プログラムが[クラッシュ]する。
💡 [ヒント]: C++では、[配列の範囲外アクセス]は[自動的にチェックされません]![これが] C++の[高速さの理由の一つ]ですが、[同時によくある]バグの[原因]でもあります。
(2) 7.2 [変数]を[配列]の[サイズ]として[使用する](C++11 [以前])
エラー例(C++11 [以前]):
#include iostream
int main() {
int n = 5;
int scores[n]; // ❌ C++11:arraycompilation
return 0;
}
[正しい記述法](C++11 [以降でサポート]):
#include iostream
int main() {
int n = 5;
int scores[n]; // ✅ C++11:array(VLA)
return 0;
}
💡 [より良い方法]: std::vector([後ほど学習します])を使用すると、[動的なサイズに対応しています]。
8. 演習:[平均点の計算]
▶ サンプル 1: [平均点を計算する] (難易度 ⭐⭐)
#include iostream
#include iomanip
int main() {
int scores[5] = {90, 85, 92, 78, 88};
int sum = 0;
// points
for (int i = 0; i < 5; i++) {
sum += scores[i];
}
// points
double average = static_castdouble(sum) / 5;
std::cout << std::fixed << std::setprecision(2);
std::cout << "points:" << sum << std::endl;
std::cout << "points:" << average << std::endl;
return 0;
}
出力:
❓ よくある質問
📖 まとめ
- 配列[は連続した]メモリ[領域]であり、[複数の同じ]型[のデータ]を格納するために用いられる
- array[の][インデックスは] 0 [から]
- [声明]array:
type array[名][[大小]]; - [初期化]array:
type array[名] = {value1, value2, ...}; - [要素へのアクセス]:
array[名][[下标]] - [配列の走査]:[使用]
forループ - 配列は[引数として渡されると][ポインタに][変換される]ため、[サイズを別途指定する必要がある]
📝 練習問題
-
初心者(難易度 ⭐): [1つの]
double配列を宣言し、[5つの価格]を格納し、[ループ]を使って[合計金額]を計算する。 -
中級(難易度 ⭐⭐): [関数]
int findMax(int arr, int size)を [作成]し、配列 [array] の [最大] 値を [求める]。main[でテスト]。 -
上級(難易度 ⭐⭐⭐): [ある]プログラムを作成し、[ユーザーに]10 [個の整数]を入力させ、[それらを]配列[に]格納し、[その後]:
-
[最大]値[と最小]値を見つける
-
[平均点を計算する]
-
出力[平均点を超えるすべての成績]
-
配列:[同一]型[要素の連続]メモリ[集合]
-
[下付き番号は] 0 [から始まる]、[宣言時にサイズを指定する必要がある]
-
array[初期化リスト] { } [サイズ(省略可)]
-
[配列の走査] forループ[インデックスとの組み合わせ]
-
array[最初の要素]のアドレス、[変更不可]
9. 🚀 次は
[配列の基礎]を学んだので、[次は] 多次元配列([第]17[回])―― [表形式のデータ]([行列]や[チェス盤]など)の扱い方を学びます。



