404 Not Found

404 Not Found


nginx

C++の配列

[前のレッスンでは]、[各]変数には[1つの]値しか格納できませんでした。

[でも、もし] 100 [人の生徒の成績] を保存したいとしたら、[100 [個の]変数]を宣言するわけには[いかない]でしょう?

配列[は、この問題を解決するものだ]――[連続した]メモリ[領域]であり、[同じ]型[のデータを]複数格納するために用いられる。


1. 配列とは何か?

(1) 1.1 [日常生活における]配列

[生活シーン] 番組[での対応]
[一列の郵便受け]([各郵便受けの番号が異なる]) 配列([各要素の添字が異なる])
[卵1パック](12 [個]、[番号] 1~12) 配列(12 [要素]、[添字] 0~11)

array[の特徴]:

  1. [すべての要素]のタイプが[同じ]([すべて] int、[またはすべて] double
  2. メモリ[連続]([要素が隣り合わせ])
  3. [下付き番号は] 0 [から始まる]([1] [から始まる] わけではない!)

(2) 1.2 なぜ配列が必要なのか?

[不要]array([悪い例]):

▶ サンプル 2: [基礎プログラミングの実践] (難易度 ⭐)

CPP
#include iostream

int main() {
 int score1 = 90;
 int score2 = 85;
 int score3 = 92;
 // ... 100!
 
 return 0;
}
▶ 試してみよう

[用法]array([良い例]):

CPP
#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 配列の宣言

[文法]:

TEXT
 ;

例:

CPP
int scores[5]; // 5
double prices[10]; // 10
char letters[26]; // 26

💡 [重要]: array[の][インデックスは] 0 [から始まる]、[したがって] scores[5] [のインデックス範囲は] 0 [から] 4 までである(1 [から] 5 までではない)。

(2) 2.2 配列の初期化

[方法1]:[宣言時に初期化]

TEXT
int scores[5] = {90, 85, 92, 78, 88};

[方法2]:[部分的な初期化]

CPP
int scores[5] = {90, 85}; //, 0

[方法3]:[コンパイラに]サイズを[推論させる]

CPP
int scores = {90, 85, 92, 78, 88}; // 5

💡 [ヒント]: [方法3の使用をお勧めします]。そうすれば、[後でarray[内容]を変更した場合でも]、[手動でサイズを変更する必要がありません]。



3. [アクセス]array[要素]

(1) 3.1 [要素の読み取り]

[文法]:

TEXT

例:

CPP
#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 [要素の編集]

CPP
#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ループ[反復処理]

CPP
#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 を使用して] [要素の数を計算する]

CPP
#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;
}

[原理]:

💡 [ヒント]: [この方法は][真の]配列にのみ適用され、[ポインタには適用されません]([後ほど学習します])。



6. array[として]function[引数]

(1) 6.1 [問題]:配列[はポインタに]退化してしまう

[arrayを]function[に渡すと]、arrayは[ポインタに][変換され]([サイズ情報が失われる])。

CPP
#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 配列[インデックスオーバーフロー]

エラー例:

CPP
#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 [以前]):

CPP
#include iostream

int main() {
 int n = 5;
 int scores[n]; // ❌ C++11:arraycompilation
 
 return 0;
}

[正しい記述法](C++11 [以降でサポート]):

CPP
#include iostream

int main() {
 int n = 5;
 int scores[n]; // ✅ C++11:array(VLA)
 
 return 0;
}

💡 [より良い方法]: std::vector([後ほど学習します])を使用すると、[動的なサイズに対応しています]。



8. 演習:[平均点の計算]

▶ サンプル 1: [平均点を計算する] (難易度 ⭐⭐)

CPP
#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;
}
▶ 試してみよう

出力:


❓ よくある質問

Q [どのようにして]配列[のすべての要素を] 0 に初期化しますか?
A > > int scores[100] = {0}; // [方法1]:[一部を初期化]([残りは自動的に] 0になる) > > int scores[100]; > for (int i = 0; i < 100; i++) { > scores[i] = 0; // [方法2]:[ループを使って]値を[代入] > } >

📖 まとめ


📝 練習問題

  1. 初心者(難易度 ⭐): [1つの] double 配列を宣言し、[5つの価格]を格納し、[ループ]を使って[合計金額]を計算する。

  2. 中級(難易度 ⭐⭐): [関数] int findMax(int arr, int size) を [作成]し、配列 [array] の [最大] 値を [求める]。 main [でテスト]。

  3. 上級(難易度 ⭐⭐⭐): [ある]プログラムを作成し、[ユーザーに]10 [個の整数]を入力させ、[それらを]配列[に]格納し、[その後]:


9. 🚀 次は

[配列の基礎]を学んだので、[次は] 多次元配列([第]17[回])―― [表形式のデータ]([行列]や[チェス盤]など)の扱い方を学びます。

Web-Tutorial.com

Web-Tutorial 技術チーム

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

100%