C言語入門|配列を使いこなす基本パターン

配列の宣言や型の考え方がなんとなく分かってきたら、
次はいよいよ 「どう使うか」 の話です。

配列は、ただ値を並べておくだけの箱ではありません。
繰り返し処理と組み合わせることで、本領を発揮する道具なんです。

ここでは、配列を使いこなすためにぜひ身につけておきたい
基本パターン を、やさしく順番に見ていきましょう。

添え字には変数が使える

まず最初に、配列を使い始めた人が驚きやすいポイントからです。

values[0]
values[1]

これまで、こんなふうに 固定の数値 を添え字に書いてきたかもしれません。
でも実は、添え字には 変数 を使うことができます。

values[i]

変数 i に 3 が入っていれば、values[3]
つまり 前から4番目の要素 にアクセスする、という意味になります。

配列は、
添え字を変数で指定してこそ意味がある
と言っても言いすぎではありません。

サンプルプログラムで雰囲気をつかもう

「10回 Hit 分のダメージ値をランダムに生成する」プログラムを例にします。

プロジェクト名:7-5-1 ソースファイル名: sample7-5-1.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    srand((unsigned)time(NULL));   // 乱数生成の準備
    int damages[10];

    // ダメージ値をランダムに生成
    for (int i = 0; i < 10; i++) {
        damages[i] = rand() % 50 + 1;   // 1〜50 のダメージ
    }

    return 0;
}

このコードでは、

  • for 文のループ変数 i
  • 配列の添え字 i

がセットになって動いています。

i が 0 → 1 → 2 → … と変わるたびに、
配列の別の要素にアクセスしている

これが、配列の基本的な使い方です。

配列 × ループは最強コンビ

配列を扱うとき、
for 文とセットで考える
というクセをつけておくと、とても楽になります。

配列の要素数が N 個なら、

要素番号添え字
1個目0
2個目1
N個目N-1

このルールにぴったり合うのが for 文です。

パターン1:ループによる全要素の利用

最もよく使われる、いちばん基本の形です。

典型的な書き方

for (int i = 0; i < 配列要素数; i++) {
    配列変数名[i] を使った処理
}

何をしているのか

  • i を 0 から始める。
  • i が 配列要素数 未満の間、処理を繰り返す
  • 1回ごとに i を 1 ずつ増やす

つまり、
配列の先頭から最後まで、1つずつ順番に処理する
という動きになります。

よくある用途

用途内容
表示全要素を画面に表示する。
初期化配列をまとめて初期化する。
更新すべての要素を一定ルールで変更する。

パターン2:ループによる集計

次に紹介するのは、
配列の中身を数えたり、合計したりするパターン です。

カウント集計の基本形

int count = 0;

for (int i = 0; i < 配列要素数; i++) {
    if (条件に一致する) {
        count++;
    }
}

最初に集計用の変数を 0 にしておき、
条件に合った要素が見つかるたびに増やしていきます。

合計と平均を求める例

ここでは、元のテスト点数とは別に
「5日分の歩数」を集計する例にしてみましょう。

プロジェクト名:7-5-2 ソースファイル名: sample7-5-2.c

#include <stdio.h>

int main(void)
{
    int steps[] = {8200, 6500, 9000, 7100, 8800};
    int sum = 0;

    for (int i = 0; i < 5; i++) {
        sum += steps[i];
    }

    int avg = sum / 5;

    printf("合計歩数:%d\n", sum);
    printf("平均歩数:%d\n", avg);

    return 0;
}

処理の流れ

  1. sum を 0 で初期化
  2. 配列の要素を 1つずつ sum に足す。
  3. 最後に要素数で割って平均を求める。

この考え方は、
点数・金額・回数・時間 など、いろいろな場面で使えます。

パターン3:添え字に対応した情報を利用する

ここからが、配列を使いこなしている感が一気に出るパターンです。

少し泥臭い例

条件分岐をたくさん書くと、コードはどうしても長くなります。

if (type == 0) {
    printf("A");
} else if (type == 1) {
    printf("B");
} else if (type == 2) {
    printf("C");
}

動きは正しいですが、
読みづらく、増やしにくい のが難点です。

配列を使って一気にスッキリさせる

ここでは、別の例として
「レベルに応じた評価文字」を表示するプログラムにします。

プロジェクト名:7-5-3 ソースファイル名: sample7-5-3.c

#include <stdio.h>

int main(void)
{
    const char RANKS[] = {'D', 'C', 'B', 'A', 'S'};
    int levels[] = {0, 2, 4, 3, 1};

    for (int i = 0; i < 5; i++) {
        printf("%c ", RANKS[levels[i]]);
    }

    printf("\n");
    return 0;
}

何が起きているのか

  • levels[i] で レベル値(0〜4)を取得
  • その値を添え字として RANKS に渡す
  • 対応する評価文字を取り出す

処理を分解すると、こうなります。

int level = levels[i];
char rank = RANKS[level];
printf("%c ", rank);

これを1行で書いているだけなんですね。

配列は「対応表」として使える

このパターンの本質は、
数値と意味を結びつける対応表 として配列を使うことです。

添え字意味
0D
1C
2B
3A
4S

switch 文を書かなくても、
配列1つで表現できるようになります。

添え字演算子の正体を少しだけ

普段なにげなく使っている [] ですが、
これは 添え字演算子 と呼ばれる演算子です。

array[i]

という書き方は、

  • 配列 array の
  • i 番目の要素を取り出す

という意味を持っています。

なお、

  • 配列宣言の []
  • 要素アクセスの []

は、見た目は同じでも 役割がまったく違う ので、
「宣言用」「取り出し用」と分けて覚えておくと混乱しません。

まとめ:配列はパターンで覚えると楽になる

今回紹介した、配列の基本パターンは次の3つです。

パターン内容
パターン1ループで全要素を処理する。
パターン2ループで集計する。
パターン3添え字を使って対応する情報を取り出す。

これらは、
C言語だけでなく、他の言語でも通用する考え方 です。

まずはこの3つを自然に書けるようになることを目標に、
少しずつ配列と仲良くなっていきましょう。