C言語の配列の宣言・初期化・アクセス方法。メモリ配置も図解。
int a[5]; で要素数5の配列a[0] から a[4] まで (0始まり)int a[] = {1,2,3};sizeof(a)/sizeof(a[0]) で要素数int score1 = 80; int score2 = 95; int score3 = 72; // … 100人分? 無理!
int score[100]; score[0] = 80; score[1] = 95; // for で一括処理もできる
int a[5] = {10, 20, 30, 40, 50}; printf("%d\n", a[0]); // → 10 printf("%d\n", a[4]); // → 50
int a[5] の 5 は「要素数」であって、a[5] は配列に存在しない![5]: 要素「個数」を指定 → 5個分のメモリ領域を確保[ ]: 「何番目」を指定 → 0〜4 の範囲だけ有効a[0] から a[4] の5個だけ。宣言の 5 と末尾インデックスの 4 がズレることを体に叩き込みましょう。a[5] や a[100] を書いてもコンパイルエラーにならない(警告すら出ないことも)。実行時に別の変数を壊したり、Segmentation fault でクラッシュしたり、最悪は一見動いて後でバグが露呈します。i < 5 と書くのは「5未満 = 0〜4」で範囲内にするため。i <= 5 だと a[5] に触れて破綻します(off-by-one エラーの定番)。
= で初期化したとき、書かなかった要素は自動で 0になります。int a[5] = {1, 2, 3, 4, 5}; // 全要素を指定 int b[5] = {1, 2}; // → {1, 2, 0, 0, 0}(残りは 0) int c[5] = {0}; // → 全要素 0(定番の初期化) int d[] = {1, 2, 3}; // サイズ省略 → 自動で 3個 int e[5]; // 初期化なし → ゴミ値(危険!)
| 書き方 | 結果 | ポイント |
|---|---|---|
{1,2,3,4,5} | 1, 2, 3, 4, 5 | 全要素を明示 |
{1,2} | 1, 2, 0, 0, 0 | 足りない分は 0 |
{0} | 0, 0, 0, 0, 0 | 全ゼロの定番 |
int d[] = {…} | 個数で自動 | サイズ省略OK |
int e[5]; | ゴミ値 | 必ず初期化を |
= を付けないと中身は不定(ゴミ値)。使う前に {0} などで初期化する習慣をつけましょう。| 変数名 | 型 | 値 |
|---|
i < N で範囲内に収めるのがコツです。int a[5] = {10, 20, 30, 40, 50}; int sum = 0; // 累積用は 0 で初期化 for (int i = 0; i < 5; i++) { sum += a[i]; } printf("%d\n", sum); // → 150
int max = a[0]; // 最初の要素で初期化(重要) for (int i = 1; i < 5; i++) { if (a[i] > max) max = a[i]; } printf("%d\n", max); // → 50
max = 0 で初期化すると、配列が全部マイナスの値のとき正しく求まりません。必ず max = a[0] のように最初の要素で初期化しましょう。
int target = 30, found = -1; for (int i = 0; i < 5; i++) { if (a[i] == target) { found = i; break; } } printf("%d\n", found); // → 2(見つかった位置)
i < N(<= は範囲外になるので NG)。80+65+92+78+88 = 403、真の平均は 403 ÷ 5 = 80.6 です。int / int → int)。
double avg = (double)sum / 5; のように片方を double にキャストしてから割る。printf("平均点 = %.1f\n", avg);(%.1f で小数1桁)。
double と (double)sum キャストで真の平均 80.6 を出してみるこの講座の理解度をチェックしましょう!
a[5] は a[0]〜a[4] の5個の要素を持つ配列です。
C言語の配列インデックスは常に 0 から始まります。a[5] なら a[0] が最初の要素です。
部分的に初期化した場合、残りの要素は 0 で初期化されます。a[2] は 0 です。