🇯🇵 日本語 | 🇺🇸 English

第20回 配列

C言語の配列の宣言・初期化・アクセス方法。メモリ配置も図解。

📖 このページで覚えること
✅ 最低限ここだけ覚える
  • int a[5]; で要素数5の配列
  • a[0] から a[4] まで (0始まり)
  • 配列の範囲外アクセスはバグ
⭐ 余裕があれば読む
  • 初期化: int a[] = {1,2,3};
  • 2次元配列は多次元配列の回で扱います
  • sizeof(a)/sizeof(a[0]) で要素数
🎬
この講座を動画で見る(約10分)
スライド解説 + 音声ナレーション

配列 ― 同じ型のデータをまとめて管理

同じ型のデータがたくさんあるとき、変数を1つずつ作るのは大変。配列なら1つの名前でまとめて扱えます。
❌ 変数を個別に作ると…
int score1 = 80;
int score2 = 95;
int score3 = 72;
// … 100人分? 無理!
⭕ 配列でまとめると…
int score[100];
score[0] = 80;
score[1] = 95;
// for で一括処理もできる
配列=同じ型の値を連続したメモリに並べ、番号(インデックス)で指定して扱う仕組み。インデックス(添字)は0から始まることに注意!
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 の範囲だけ有効

int a[5]; // ← 5個の箱を確保 (a[0], a[1], a[2], a[3], a[4])
a[0] = 10; // ✅ 最初の要素
a[4] = 50; // ✅ 最後の要素
a[5] = 99; // ❌ 範囲外! 存在しないメモリを壊す (未定義動作)

用意されるのは a[0] から a[4] の5個だけ。宣言の 5 と末尾インデックスの 4 がズレることを体に叩き込みましょう。

なぜこの設計? インデックスが「先頭から何個ずれた位置か」を表すから。先頭は「ずれなし = 0」、そこから 5個あれば末尾は「4個ずれ = 4」。
💡 範囲外アクセスの怖さ: C言語は 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} などで初期化する習慣をつけましょう。

ステップ実行 ― 配列とfor文

array_demo.c

変数の状態

変数名

配列メモリ

標準出力

 

for で配列を活用 ― 合計・最大値・検索

配列と for を組み合わせる定番パターン。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(見つかった位置)
合計・最大・検索のどれも「0 から N-1 まで for で回す」のが基本形。条件は i < N<= は範囲外になるので NG)。

自分で書いてみよう ― 配列

my_array.c
出力
「実行」を押してください...
⚠️ 「平均点 = 80」は本当? ― 整数除算の罠
合計は 80+65+92+78+88 = 403、真の平均は 403 ÷ 5 = 80.6 です。
なのに画面には 80 と出ます。これは C の 整数同士の割り算は小数部を切り捨てるためです (int / int → int)。
正しく 80.6 を得るには:
double avg = (double)sum / 5; のように片方を double にキャストしてから割る。
出力は printf("平均点 = %.1f\n", avg);%.1f で小数1桁)。
💡 「整数割り算は切り捨て」は C でハマりやすいポイント第1位。第8回(算術演算子)でも詳しく扱います。
💡 こんなことも試してみよう

関連する講座

繰り返し・配列・文字列
第29回 乱数の生成
C言語のrand()とsrand()の使い方。乱数の範囲指定・シード・応用例を図解で解説。
繰り返し・配列・文字列
第16回 for文
C言語のfor文とwhile文の使い方。ループ処理を図解で解説。
繰り返し・配列・文字列
第23回 文字列
C言語の文字列(char配列)の扱い方。strcpy, strlen, strcmp等の文字列関数。
関数編
第32回 配列を引数に
C言語で関数に配列を渡す方法。ポインタとの関係も解説。
← 前の講座
第19回 デバッグの技法
次の講座 →
第21回 確認問題(配列)

確認クイズ

この講座の理解度をチェックしましょう!

Q1. int a[5]; で確保される要素数は?

4個
5個
6個

a[5] は a[0]〜a[4] の5個の要素を持つ配列です。

Q2. 配列のインデックスは何番から始まる?

0
1
任意

C言語の配列インデックスは常に 0 から始まります。a[5] なら a[0] が最初の要素です。

Q3. int a[3] = {1, 2}; のとき a[2] の値は?

未定義
0
2

部分的に初期化した場合、残りの要素は 0 で初期化されます。a[2] は 0 です。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。