ベイジアン研究所

技術(人工知能、数学等)と心理の話をしています。

【C言語入門】配列編

1. 配列とは
同じ型で、連続した変数などは統一的に扱いたい。(例えば、1から100までの整数など)そのような時、配列を使用するのが便利である。

配列とは、同じ型の集まりを番号で管理したものである。例えば次のように宣言する。

int a[5];

このように宣言した時、a[0]~a[4]で変数を扱う事ができる。この[ ]を、添字演算子と呼び、配列の要素にアクセスする方法を与える。
・添字演算子
a[b] : 配列aの先頭からb個後ろの要素にアクセスする。

f:id:camelsan:20200926081146p:plain double型などの配列の宣言も同様に行う。

double a[5];

一般に、要素型をTypeと書くことにすると、Type型の配列の宣言は次のようになる。

Type a[5];

2. 配列の走査
配列を用いる事で、要素を一つづつ順番になぞって扱う事ができる。これを配列の走査という。例えば次のようなプログラムを書く事ができる。

#include <stdio.h>

int main(void)
{
    int i;
    int v[5];
    
    for (i=0; i<5; i++) {
        v[i] = i + 1;    
    }
    for (i=0; i<5; i++) {
        printf("v[%d] = %d¥n", i, v[i]);
    }

    return 0;
}

実行結果としては次のようになる。

v[0] = 1
v[1] = 2
v[2] = 3
v[3] = 4
v[4] = 5

つまり、上記のプログラムは、v[0]~v[4]に順番に1から5まで代入し、v[0]~v[4]を表示するプログラムである。

2. 配列の初期化
配列の初期化は、次のように書く。

int v[5] = {1, 2, 3, 4, 5}

つまり、各要素に対する初期化子をカンマで区切って、順に並べたものを{ }で囲む。
また、以下のようなルールがある。

  • 素数は省略できる
    f:id:camelsan:20200926083327p:plain

  • { }内に初期化子がない要素は、0で初期化される
    f:id:camelsan:20200926083535p:plain

  • 初期化子が要素数より多いとエラー
    f:id:camelsan:20200926083714p:plain

  • 初期化子は代入できない
    f:id:camelsan:20200926084042p:plain

3. 配列のコピー
C言語では、配列の代入は不可である。例えば次のような処理は不可能である。

int a[5] = {1, 2, 3, 4, 5};
int b[5];
a = b;

このような操作が不可能なのは、ポインタと呼ばれるものと関係しているが、今は気にしなくても良い。

しかしながら、配列を代入する方法はある。配列を代入したい時はfor文を使って、要素を一つづつ代入してゆけば良い。例えば、次のようなプログラムを書く事ができる。

#include <stdio.h>

int main(void)
{
    int i;
    int a[5] = {3, 6, 9};
    int b[5];

    for (i=0; i<5; i++) {
        b[i] = a[i];
    }
    for (i=0; i<5; i++){
        printf("%d%d¥n", a[i], b[i]);
    } 

    return 0;
}

4. 多次元配列
配列も一つの要素型なので、配列を要素にもつ配列も考える事ができるこれを多次元配列という。(数学で言う行列などをイメージしておけば良い)。例えば、

int a[4][3];

は、「"int"を要素型とする要素数3の配列」を要素型とする要素数4の配列である。前の数字「4」が行数、後ろの数字「3」が列数を表す、行列であると見る事ができる。それぞれの要素のアクセスの方法は次の図のようになる。
f:id:camelsan:20200926090322p:plain