複数のデータを扱うための配列について説明していきます。

配列

今まで、たくさんの数値などのデータを扱うためには、必要なデータの数だけ変数を用意する必要がありました。

しかし、それが数個程度であればいいのですが、100個や1000個など膨大な数になると、それだけ変数名を変えながら、変数を用意する必要があり、現実的に無理だと言えます。

そこで、たくさんのデータを扱うのに便利な配列を説明します。

配列を使って5人のテストの点数を代入して表示してみます。

#include <stdio.h>

int main(void)
{
    int point[5];

    point[0] = 56;
    point[1] = 75;
    point[2] = 82;
    point[3] = 63;
    point[4] = 10;

    printf("一人目の点数: %d\n", point[0]);
    printf("二人目の点数: %d\n", point[1]);
    printf("三人目の点数: %d\n", point[2]);
    printf("四人目の点数: %d\n", point[3]);
    printf("五人目の点数: %d\n", point[4]);

    return 0;
}

5人の点数として、それぞれ56、75、82、63、10という点数を代入しました。

配列は、「int point[5];」という部分で用意しています。変数を用意するときとは違い、変数名の後に大かっこ([ ])を書き、その大かっこの中に整数を書いています。

この整数は、配列の要素数を表しています。

要素数は、配列に入れることができるデータの数です。

ここでは、5となっているので、要素数は5であり、この配列には5個のデータを入れることができます。

ちなみに、この配列はint型の配列となっているので、整数しか代入することができません。小数を代入したい場合は、「double point[5];」のように、変数の型を変更しましょう。

配列を用意したら、その配列に値を代入していきます。

配列名は「point」です。その配列point に値を代入するには、point[0]やpoint[1]のように、配列名の後に大かっこを書き、その大かっこの中に整数を書きます。この大かっこの中に書く数字のことを添字(そえじ)と言います。

その後に、代入のためのイコールを書いて、値を書きます。

イコールと代入したい値を書くというのは、変数と同じです。

配列の特殊な部分は、添字です。

最初に配列point は要素数が5という説明しました。

そのため、配列に値を代入するときには、その5つのデータが入る場所の内、どこに値を入れるのかを指定する必要があります。

その指定の方法が、大かっこの中の整数である添字です。

今回、要素数は5なので、添字は0から4の五つの数字で指定します。

最初が0から始まるので、最後が4となり、合計で5つの数字を入れることができます。

図として表すとこのようなイメージになります。

array-point.png

これに値を代入したイメージはこのようになります。

array-point-full.png

代入が終わったら、配列の中身を表示しています。

表示は、代入の時と同じように配列名と添え字を書きます。

配列にはint型のデータが代入されているので、printf関数では、%d を使用しています。

配列の注意として、配列内では、同じ型のデータしか扱うことができません。なので、int型のデータとdouble型のデータの両方を同じ配列で利用するということはできず、その場合は、int型の配列とdouble型の配列の2つを用意する必要があります。

繰り返しと配列

今までの配列を使ったプログラムでは、配列を使いこなしているとは言えません。

配列を使って便利だと感じるのは、for 文や while 文などの繰り返しと組み合わせて使っている時です。

次のソースコードは、入力された10の数字を配列に代入して、配列の値を全て足したものを答えます。

#include <stdio.h>

int main(void)
{
    int num[10];
    int i;
    int sum = 0;

    for (i = 0; i < 10; i++) {
        scanf("%d", &num[i]);
    }

    for (i = 0; i < 10; i++) {
        sum += num[i];
    }

    printf("sumの値は%dです\n", sum);

    return 0;
}

通常であれば、10個の入力をするのであれば、scanf関数を10個書くか、「scanf("%d %d %d……」のようにたくさんの%d と配列名を書かなければならなかったのが、繰り返しと配列を使うだけで、短く書くことができました。

さらに、足し算においても、ひとつひとつ配列の中の値を参照しなければならなかったのが、繰り返しを使うことで、短く分かりやすくなりました。

このように、配列と繰り返しは相性がよく、頻繁に用いられます。

初期化

配列は、変数と同じように代入や初期化の処理をせずにデータを参照しようとすると、変な値が表示されることがあります。

そこで、配列の初期化の方法を示しておきます。

#include <stdio.h>

int main(void)
{
    int a[5] = {}; // 全て0
    int b[] = { 1, 2, 3, 4, 5 }; // 要素数5
    int c[5] = { 1, 2, 3 }; // 要素数5 0〜2番目まで指定された値が代入され3,4番目は0が代入

    return 0;
}

3つの初期化の方法を説明します。

ひとつめの「int a[5] = {};」は、要素内全てのデータを0として初期化する方法で、イコールの後に、中かっこだけ書きます。

ふたつめの「int b[] = { 1, 2, 3, 4, 5 };」は、指定した値で初期化する方法で、イコールの後に、カンマで区切って値を書きます。この時、要素数は中かっこ内の値の数になるので、大かっこ内に要素数を書く必要はありません。

みっつめの「int c[5] = { 1, 2, 3 }」は、指定した値で初期化する方法ですが、大かっこ内の要素数と中かっこ内の値の数が一致していません。この時は、大かっこの数字が要素数となり、中かっこ内で指定していない場所の要素は、0として初期化されます。

多次元配列

配列には、多次元配列というものがあります。

これは、添字を複数書くことで使うことができません。

次のソースコードは、九九の結果を、二次元配列と呼ばれる、添字をふたつ書いて使う配列に代入して表示します。

#include <stdio.h>

int main(void)
{
    int i;
    int j;
    int a[9][9];

    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= 9; j++) {
            a[i - 1][j - 1] = i * j;
        }
    }

    for (i = 0; i < 9; i++) {
        for (j = 0; j < 9; j++) {
            printf("%3d", a[i][j]);
        }
        printf("\n");
    }

    return 0;
}

二次元配列は、「int a[9][9]」のように大かっこを2つかき、そこにそれぞれ要素数を書きます。値の参照も、それぞれの大かっこの中に添字を書きます。

今までの配列は、一次元配列とも呼ばれているもので、用意した画像のように、線でイメージします。

二次元配列は、線でイメージするのは難しく、表やグラフでイメージした方が分かりやすいです。

表でイメージする場合、「a[i][j]」とあった場合に、i の値は表を上から数えて何番目かの値を示します。j の値は表を横から数えて何番目か値を示します。

二次元配列なので、表でイメージしましたが、大かっこを3つ書いて「int a[9][9][9];」のように書いた場合、三次元配列と呼ばれ、立体の図形をイメージすると分かりやすいです。

(三次元配列の場合、ひとつめが縦、ふたつめが横、みっつめが高さを表す立体をイメージします。)

このように、大かっこでかく要素数の数を増やしていくと、二次元、三次元、四次元……、というように呼ばれ、それらを総称して多次元配列と呼ばれます。

次元を増やしていくと、イメージがしにくくなり、扱いにくくなります。考えて使うようにしましょう。

まとめ

配列に関する説明は、他のものに比べて短くなりました。

なぜ短くなったのかというと、今後説明する「ポインタ」や「文字列」でより詳しく説明や使い方を紹介するからです。

ポインタや文字列を理解していく上で重要なので、忘れてしまったら、ここに戻ってきて、見返すようにしましょう。