第2章の2 配列

1. 配列とは

「配列」とは同種のデータ型を集めたものです。

配列を用いると、関連のある複数のデータをまとめて扱うことができます。 尚、この章では「1次元配列」の説明だけ行うことにします。 「2次元配列」については第9章をご参照ください。

2. 配列の宣言

変数と同様、プログラムの先頭で型と配列名、要素数の宣言を行います。

【配列の宣言例】
この宣言でメモリ上にはnumberという名前の要素数5のint型の配列が確保されます。宣言しただけでは変数と同様中身は不定値です。

(1) 配列データの初期化

配列に格納する値を{}の中に順番にカンマ(,)で区切りながら記述します。記述した順に先頭から配列に格納されます。

【配列の初期化例】

要素数について

  • 初期化子が記述されている場合に要素数を省略するとコンパイラは自動的に初期化子分の要素数をメモリ上に確保します。
int number[] = {10, 11, 12, 13, 14};
  • 要素数が省略できるのは、初期化データを宣言しているときのみです。単に
int no[];

とすると、コンパイラは配列の要素数がわからず、エラーを出します。

  • 初期化子が要素数で指定した要素数より大きい場合はコンパイルエラーとなります。
int no[5] = { 1, 2, 3, 4, 5, 6 }; // コンパイルエラー
  • 配列の初期化では、初期化の足りない要素は 0 で初期化されます。
int no[5] = {0};

とすると、配列no の 5個の要素全てに 0 を設定することが出来ます。
また、

int no[5] = {1};

とすると、{ 1, 0, 0, 0, 0 } で初期化されます。

  • この初期化は宣言時のみ可能です。宣言後に初期化を行おうとすると、コンパイルエラーとなります。
int no[5];
no[] = { 1, 2, 3, 4, 5 }; // コンパイルエラー

 (2) 配列データの取り扱い方

配列の後ろに[ ]で囲んで記述する数字を「添字」といい、配列を 0 から順番に数えます。配列は添字を直接指定してデータをアクセスします。

配列の要素を利用するプログラム例

#include <stdio.h>

int main(void)
{
    int array1[] = {1, 2, 3};
    int array2[5];

    array2[0] = 10;
    array2[1] = array1[0];
    array2[2] = array1[1] + 100;

    printf("array2[0] = %d\n", array2[0]);
    printf("array2[1] = %d\n", array2[1]);
    printf("array2[2] = %d\n", array2[2]);
    
    return 0;
}

【実行結果例】
array2[0] = 10
array2[1] = 1
array2[2] = 102

【解説図】

配列の扱い方  サンプルプログラム

#include <stdio.h>

int main(void)
{
    int cnt[4] = {6, 18, 33, 76};          // cntをint型4個の配列で宣言後、初期化
    long goukei[2];                        // goukeiをlong型2個の配列で宣言
    float x, y[] = {1.1f, 2.8f, 6.5f};     // yをfloat型3個の配列で宣言後、初期化
    double z[3];                           // zをdouble型3個の配列で宣言

    x = 2.6f;                              // xに2.6を代入
    z[0] = x + y[0];                       // x + y[0]をz[0]に代入
    z[1] = x + y[1];                       // x + y[1]をz[1]に代入
    z[2] = x + y[2];                       // x + y[2]をz[2]に代入

    goukei[0] = 100 * (cnt[0] + cnt[1]);   // 100 * (cnt[0]+cnt[1]) を goukei[0]に代入
    goukei[1] = 100 * (cnt[2] + cnt[3]);   // 100 * (cnt[2]+cnt[3]) を goukei[1]に代入

    printf("z[0] = %f\n", z[0]);           // z[0]を出力
    printf("z[1] = %f\n", z[1]);           // z[1]を出力
    printf("z[2] = %f\n", z[2]);           // z[2]を出力
    printf("goukei[0] = %ld\n", goukei[0]); // goukei[0]を出力
    printf("goukei[1] = %ld\n", goukei[1]); // goukei[1]を出力

    return 0;
}

【実行結果例】
z[0] = 3.700000
z[1] = 5.400000
z[2] = 9.100000
goukei[0] = 2400
goukei[1] = 10900

〇 演習問題

問題

整数型配列 data1 にデータが初期設定されている。 この配列 data1 のデータを実行結果例のようになるように、(省略部)を埋めてdata2に代入しなさい。

#include <stdio.h>

int main( void )
{
    int data1[6] = {18, 25, 46, 11, 3, 76};
    int data2[6];

    (省略部)

    printf("data2[0] = %d\n", data2[0]);
    printf("data2[1] = %d\n", data2[1]);
    printf("data2[2] = %d\n", data2[2]);
    printf("data2[3] = %d\n", data2[3]);
    printf("data2[4] = %d\n", data2[4]);
    printf("data2[5] = %d\n", data2[5]);

    return 0;
}

【実行結果例】
data2[0] = 76
data2[1] = 11
data2[2] = 46
data2[3] = 18
data2[4] = 25
data2[5] = 3

解答例

#include <stdio.h>

int main( void )
{
    int data1[6] = {18, 25, 46, 11, 3, 76};
    int data2[6];

    data2[0] = data1[5];
    data2[1] = data1[3];
    data2[2] = data1[2];
    data2[3] = data1[0];
    data2[4] = data1[1];
    data2[5] = data1[4];

    printf("data2[0] = %d\n", data2[0]);
    printf("data2[1] = %d\n", data2[1]);
    printf("data2[2] = %d\n", data2[2]);
    printf("data2[3] = %d\n", data2[3]);
    printf("data2[4] = %d\n", data2[4]);
    printf("data2[5] = %d\n", data2[5]);

    return 0;
}

コメント