C言語学習ポータル(無料版) 学習コンテンツ 配列 配列とループの黄金コンビ

🗃️ 配列

配列とループの黄金コンビ

無料公開版に収録・読む目安 12分

🎯 forループで配列全体を走査でき、要素数を安全に管理できる

配列とfor文は、Cでいちばん出番の多い組み合わせです。「同じ処理を、全要素に対して」というパターンは、この形にすべて収まります。

for (int i = 0; i < n; i++) {
    // a[i] に対する処理
}

この5行が体に入ると、合計・平均・最大値・検索・並べ替えまで、ほとんどの処理が同じ骨格で書けるようになります。中身を差し替えるだけで、やれることが次々に増えるからです。

骨格が同じなので、毎回考えるのは「中身」だけになります。t08-08では、この型を3つ正確な形で身につけます。

#include <stdio.h>

int main(void)
{
    int a[5] = {60, 85, 40, 90, 75};
    int sum = 0;

    for (int i = 0; i < 5; i++) {
        sum += a[i];
    }
    printf("合計 %d / 平均 %.1f\n", sum, (double)sum / 5);
    return 0;
}

sum をループの外で宣言しているところに注目してください。中で宣言すると毎回 0 に戻ってしまい、合計になりません。

要素数を1か所で管理する

上のコードには 5 が3か所(宣言・ループ・平均)に散らばっています。人数が6人になったとき、1か所でも直し忘れると事故です。要素数には名前を付けましょう。

#include <stdio.h>

#define N 5      // 要素数に名前を付ける

int main(void)
{
    int a[N] = {60, 85, 40, 90, 75};
    int sum = 0;

    for (int i = 0; i < N; i++) {
        sum += a[i];
    }
    printf("平均 %.1f\n", (double)sum / N);
    return 0;
}

もうひとつ、配列そのものから要素数を計算する定石もあります。

int n = sizeof(a) / sizeof(a[0]);

「全体の大きさ ÷ 1個の大きさ = 個数」という素直な計算です。ただしこれが使えるのは配列を宣言した関数の中だけで、配列を関数に渡した先では使えません。理由は t08-07 で説明します。

なぜ要素数が散らばると危ないのか

配列の宣言は [5] のまま、ループだけ i < 6 に書き換えてしまった——この一手で、プログラムは静かに壊れます。しかも運が良ければ動いてしまうので、テストをすり抜けることがあります。数字を1か所にまとめるのは、単なる整理整頓ではなく安全対策なのです。

while文でも書ける

添字を自分で進める書き方もできますが、初期化・条件・更新が1行にまとまる for のほうが、範囲の間違いに気づきやすくなります。配列の走査は for が基本と覚えておきましょう。

罠・注意

ビット「配列を見たらfor」。この反射ができれば、もう半分マスターだよ

なお、配列の一部だけを処理したいときも同じ形です。開始と終了を変えるだけで、for (int i = 2; i < 5; i++) なら3番目から5番目まで、といった具合に自由に切り取れます。その場合も、両端が 0 と n−1 の内側に収まっているかを必ず確かめてください。

まとめ: for (int i = 0; i < n; i++) が配列処理の基本形。要素数は1か所で管理し、合計用の変数はループの外に置く。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

for文ふぉーぶん

「初期化・条件・更新」の3つを1行にまとめて書ける繰り返し構文のこと。回数があらかじめ決まっている繰り返しにとくに向いている。繰り返す回数があらかじめはっきりしている場面で、とくに書きやすい構文。

while文わいるぶん

条件が真である間、処理を繰り返す構文のこと。何回繰り返すかが実行前には分からない場合に向いた、シンプルな繰り返し構文。条件を書き間違えると、意図せず無限ループになってしまうことがある。

同じトラックのほかの項目

配列とは——箱の行列配列の宣言と要素へのアクセスができ、変数を並べるより配列が優れる理由を説明できる 添字と0始まりの理由添字が0始まりである理由を理解し、範囲を間違えずにループを書ける 境界外アクセスという重大事故境界外アクセスが未定義動作であることを理解し、危険性と防ぎ方を説明できる 配列の初期化いろいろ配列の初期化の書き方を使い分けられ、未初期化の危険を避けられる 多次元配列2次元配列を宣言・初期化し、二重ループで表として扱える 配列を関数に渡す——入口編配列を関数へ渡す書き方を身につけ、値渡しとの違いに気づける 集計・最大値・検索の定石合計・最大値・線形探索の定型パターンを自力で書ける
‹ 添字と0始まりの理由 境界外アクセスという重大事故 ›

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH