20 配列

同じ型の値を連続して管理する「配列」を学ぶ。
ループと組み合わせると大量のデータを効率よく扱える。


20-1 配列とは

配列とは、同じデータ型の変数が複数、連続したメモリ領域に並んだもの
個別の変数を何個も用意する代わりに、1つの名前でまとめて管理できる。

配列を使わない場合と使う場合の比較

20_01_noArray.c
#include <stdio.h>

int main(void)
{
    int a, b, c, d, e;
    int sum;

    printf("5人の点数を入力してください: ");
    scanf("%d %d %d %d %d", &a, &b, &c, &d, &e);
    sum = a + b + c + d + e;
    printf("合計: %d\n", sum);
    return 0;
}
20_02_withArray.c
#include <stdio.h>

int main(void)
{
    int score[5];
    int i, sum = 0;

    printf("5人の点数を入力してください:\n");
    for (i = 0; i < 5; i++) {
        scanf("%d", &score[i]);
        sum += score[i];
    }
    printf("合計: %d\n", sum);
    return 0;
}
✅ 配列を使うと、人数が増えても score[100] と数字を変えるだけで対応できる。
変数を100個宣言する必要がない。

20-2 配列の宣言と初期化

データ型  配列名[要素数];
int score[5];                         /* 要素数のみ(中身は不定) */
int score[5] = {100, 80, 90, 75, 60}; /* 要素数と初期値を同時に指定 */
int score[]  = {100, 80, 90};         /* 要素数は初期値の個数から自動決定 */
int score[5] = {10, 20};              /* 残りの要素は 0 で初期化される */

メモリ上のイメージ

int score[5];(未初期化)

score[0]score[1]score[2]score[3]score[4]
???????????????

int score[5] = {10, 20, 30};

score[0]score[1]score[2]score[3]score[4]
10203000
⚠ 要素番号は 0 から始まる。要素数 5 の配列の有効な添字は 0〜4。
score[5] にアクセスすると範囲外で未定義動作になる。

20-3 各要素へのアクセス

配列名[添字]

添字(インデックス)に変数を使えるのが配列の強み。ループと組み合わせる。

int score[5] = {80, 70, 90, 60, 85};

score[2] = 95;            /* score[2] を上書き */
printf("%d\n", score[2]); /* 95 と表示 */

20-4 配列とループの組み合わせ

20_03_arrayLoop.c
#include <stdio.h>

int main(void)
{
    int data[5] = {10, 20, 30, 40, 50};
    int i, sum = 0;

    /* 全要素に +1 する */
    for (i = 0; i < 5; i++) {
        data[i] += 1;
    }

    /* 合計を計算しながら表示 */
    for (i = 0; i < 5; i++) {
        printf("data[%d] = %d\n", i, data[i]);
        sum += data[i];
    }
    printf("合計: %d\n", sum);
    return 0;
}
data[0] = 11
data[1] = 21
data[2] = 31
data[3] = 41
data[4] = 51
合計: 155
✅ for 文のカウンタ変数をそのまま配列の添字に使うパターンは頻出。
for (i = 0; i < 要素数; i++) が基本形。

20-5 キーボードから配列に入力する

20_04_arrayInput.c
#include <stdio.h>

int main(void)
{
    int score[5];
    int i, sum = 0;
    double avg;

    printf("5人の点数を入力してください(1つずつ Enter):\n");
    for (i = 0; i < 5; i++) {
        printf("score[%d]: ", i);
        scanf("%d", &score[i]);
        sum += score[i];
    }

    avg = sum / 5.0;
    printf("合計: %d\n", sum);
    printf("平均: %.1f\n", avg);
    return 0;
}
5人の点数を入力してください(1つずつ Enter):
score[0]: 80
score[1]: 70
score[2]: 90
score[3]: 60
score[4]: 85
合計: 385
平均: 77.0

20-6 演習

📝 演習① 最大値を求める

5つの整数を配列に格納し、最大値を表示するプログラムを作れ。

20_05_maxValue.c
#include <stdio.h>

int main(void)
{
    int data[5] = {34, 12, 78, 45, 23};
    int i, max;

    /* ここに最大値を求める処理を書く */

    printf("最大値: %d\n", max);
    return 0;
}
ヒントを表示

max = data[0]; で最初の要素を仮の最大値にしてから、残りと比較する。

答えの例を表示
    max = data[0];
    for (i = 1; i < 5; i++) {
        if (data[i] > max) {
            max = data[i];
        }
    }
📝 演習② 配列を逆順に表示する

5つの整数を配列に格納し、逆順に表示するプログラムを作れ。

20_06_reverse.c
#include <stdio.h>

int main(void)
{
    int data[5] = {1, 2, 3, 4, 5};
    int i;

    /* ここに逆順表示の処理を書く */

    return 0;
}
答えの例を表示
    for (i = 4; i >= 0; i--) {
        printf("%d ", data[i]);
    }
    printf("\n");

20-7 理解度チェック

Q1. int a[5]; の添字として有効な範囲はどれか。

解説を表示

正解:イ

要素数 5 の配列の添字は 0〜4。a[5] は範囲外で未定義動作になる。

Q2. int a[5] = {1, 2}; のとき a[4] の値はどれか。

解説を表示

正解:ウ

初期化リストで指定されなかった残りの要素は 0 で初期化される。

Q3. 次のコードの出力として正しいものはどれか。

int a[4] = {10, 20, 30, 40};
printf("%d\n", a[1] + a[3]);
解説を表示

正解:ウ

a[1] = 20、a[3] = 40。20 + 40 = 60。

Q4. 配列と for 文を使う利点として最も正しいものはどれか。

解説を表示

正解:イ

添字に i などの変数を使うことで、ループと組み合わせて大量の要素を効率よく処理できる。