C言語の配列の使い方

238, 2021-04-28

目次

C言語の配列の使い方

C言語には基本的なデータ構造として配列があります。
配列を使うと複数のデータを1つの変数にまとめることができます。

現代的なプログラミングでは配列は必須の概念と言えます。
この記事ではC言語で使える配列の基本的な作り方と使い方を解説します。
具体的には↓を見ていきます。

  • 配列とは?

  • C言語の配列の作り方

  • 配列の初期化方法

  • 配列の参照方法

  • 配列の値の上書き方法

  • 配列をfor文で回す

  • 配列の要素の求め方

配列とは?

配列とはデータ構造の一つです。
先ほども解説しましたが、複数のデータを1つの変数にまとめたい時に使います。

配列には種類があり、1つが固定長配列ともう1つが可変長配列です。
今回解説するのは固定長配列の方です。

固定長配列は配列全体のサイズが決まっている配列のことを言います。
作るのが簡単で、管理も楽です。そのためC言語では色々なシーンで使われます。

いっぽう可変長配列とは配列全体のサイズが決まっていない配列のことです。
保存したいデータ量に合わせて配列全体を伸縮させるため、柔軟にデータを保存することができます。

配列内の1つの1つのデータを要素と言います。
たとえば固定長配列の中に10個のデータが保存されていた場合、その配列のサイズは要素10個分、つまり長さが10になります。
配列全体のサイズを「長さ」と表現することもあります。これは英語で「length」ですが省略記法の「len」もよく使われます。

C言語の配列の作り方

C言語における固定長配列の作り方を解説します。
配列は↓のように宣言します。

型 配列名[要素数];

たとえばint型で要素数が4の配列を作りたい場合は↓のようにします。

int array[4];

↑のようにすると初期化されていない配列を作ることができます。
初期化されていないので配列の各要素にはデタラメな値が入ります。
例外として、グローバル領域で宣言された配列は0クリアされます。

配列の初期化方法

さきほどの配列arrayを初期化する方法を解説します。
配列を宣言と同時に初期化するには、波カッコを使います。
たとえば1番目の要素に1, 2番目の要素に2といった風に初期化したい場合は↓のようにします。

int array[4] = {1, 2, 3, 4};

↑のようにすると配列の各要素には先頭から1, 2, 3, 4と値がセットされます。
配列を0クリアしたい場合は↓のように最初の要素に0をセットするだけで、残りの要素はすべて0クリアされます。

int array[4] = {0};

また、初期化する場合は配列の要素数は省略することができます。
この場合は初期化された要素数分だけ配列の要素が確保されます。

int array[] = {1, 2, 3, 4};

配列の参照方法

定義した配列をprintf()などで参照したい場合は角カッコを使います。
配列名のとなりに角カッコを書き、参照したい要素の添え字を指定すると、その要素の値を参照することができます。

#include <stdio.h>

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

    printf("%d\n", array[0]);  // 0番目の要素を参照
    printf("%d\n", array[1]);  // 1番目の要素を参照
    printf("%d\n", array[2]);  // 2番目の要素を参照
    printf("%d\n", array[3]);  // 3番目の要素を参照
    return 0;
}
1
2
3
4

配列の参照に使う添え字は0ベースで始まります。
つまり1番目の要素は添え字では0番目、2番目の要素は添え字では1番目になります。

配列自体を参照すると、その配列のアドレスを得ることができます。

printf("%p\n", array);

配列名をそのまま参照すれば、その配列のアドレス値を得ることが出来るため、ポインタ変数には↓のように配列を代入することができます。

int array[4];
int *p = array;

ちなみにポインタ変数pに対して角カッコでアクセスすると、配列arrayの要素を参照することができます。

printf("%d\n", p[0]);

配列の値の上書き方法

配列内の要素の値を上書きするには角カッコで要素にアクセスして、その要素に対して演算を行います。
たとえば代入を行えばその要素の値を上書きすることができます。

array[0] = 10;

int型の配列であれば↓のように加算代入なども行えます。

array[0] += 1;
array[0] -= 2;
array[0] *= 3;
array[0] /= 4;
array[0] %= 5;

配列の要素の求め方

配列の要素数を求めるにはsizeof演算子などを使います。
詳細については↓の記事をご覧ください。

配列をfor文で回す

配列をfor文で回す方法です。
基本的にはfor文で配列の添え字を参照するカウント変数をカウントして、そのカウント変数を使って配列の要素を参照するという手順になります。
配列のサイズを決め打ちで使う場合は↓のようになります。

int array[] = {1, 2, 3, 4};

for (int i = 0; i < 4; i++) {
    printf("%d\n", array[i]);
}

↑の方法は配列のサイズが変わった場合にfor文の修正も必要なためあまり使われません。
よく使われるのは配列内に番兵を配置し、その番兵をfor文で検出する方法です。
たとえば先ほどの配列array-1という番兵を置くとします。
そしてfor文で-1を検出したらfor文から抜けるという具合です。

int array[] = {1, 2, 3, 4, -1};

for (int i = 0; array[i] != -1; i++) {
    printf("%d\n", array[i]);
}

他には↓のようにsizeof演算子で配列の要素数を求めて、その値だけfor文を回すというテクニックもあります。
こちらは関数の引数やポインタ変数には使えないので注意が必要です。

int array[] = {1, 2, 3, 4};
int len = sizeof(array) / sizeof(array[0]);  // 配列の長さを求める

for (int i = 0; i < len; i++) {
    printf("%d\n", array[i]);
}

特殊な場合としてポインタ配列の場合はNULLを番兵にするというのがよく使われます。

const char *array[] = {"cat", "dog", "bird", NULL};

for (const char **p = array; *p; ++p) {
    printf("%s\n", *p);
}

おわりに

今回はC言語の配列の使い方を解説しました。
配列は関数と並んでC言語の必須技術と言えます。
習得の方がんばってください。

配列の数だけドラマがある

セグフォがある

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。