Categories: C言語

【C言語】同じ型の要素をまとめて管理する方法【配列の使い方】

この記事では、C言語の配列(array)について解説します。

配列とは、1つの変数で同じ型の値をいくつも管理するための機能です。同じ目的で扱う値が複数存在している場合、配列にまとめることで管理や処理が楽になります。

また、配列はfor文と組み合わせることで強力に扱うことができます。

この記事で学べること
  • 配列の使い方
  • 配列の要素数(長さ)の取得
  • 多次元配列

それでは、C言語の配列の使い方を見ていきましょう!

配列の使い方

C言語の配列は、以下のように宣言・初期化・要素にアクセスします。

配列に格納されている値を「要素」と呼ぶ

宣言

配列は、[]を使って宣言します。要素数は、整数で指定します。

型名 変数名[要素数];

int型の要素を3つ持った配列numsを宣言するには以下のようにします。

int nums[3];

要素数にはできるだけマジックナンバーを使わない方が良いとされています。マクロを使うことでマジックナンバーを使わずに要素数を定義できます。

// マクロで配列の長さを定義
#define LENGTH 3

int main(void) {

    int nums[LENGHT];
}

初期化

{}の中に値を,(カンマ)で区切って要素数だけ渡します。

型名 変数名[要素数] = {値1, 値2, ..., 値N};

初期化時に要素数を省略することで、渡された値の要素数の配列が生成できます。

型名 変数名[] = {値1, 値2, ..., 値N};

渡された値が指定した要素数より少ない場合は0で初期化される

int nums[3] = {1, 2};  // {1, 2, 0}

要素にアクセス

各要素にアクセスするには、[]内にインデックス(添字)を指定します。

変数[インデックス];

注意として インデックスは 0 から始まります

int nums[] = {1, 2, 3};
nums[0];  // 1
nums[1];  // 2
nums[2];  // 3

それぞれの要素にアクセスして初期化・変更することもできます。

int nums[3];
nums[0] = 4;
nums[1] = 5;
nums[2] = 6;

範囲外のインデックスを指定してもエラーにはなりませんが、よくわからない値にアクセスしてしまいます。

int nums[] = {1, 2, 3};
printf("%d\n", nums[3]);
// 466092055

配列を使ってみる

それでは簡単なサンプルを見てみます。以下のコードは、nums配列 を初期化し、格納された要素を出力しています。

#include <stdio.h>

int main(void) {

    // 配列の宣言・初期化
    int nums[] = {1, 2, 3};

    printf("%d, %d, %d\n", nums[0], nums[1], nums[2]);

    // 各要素にアクセスして値を書き換える
    nums[0] = 4;
    nums[1] = 5;
    nums[2] = 6;

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

実行結果

1, 2, 3
4, 5, 6

配列の要素数(長さ)を取得する

配列の長さを求めるには sizeof演算子 を使います。sizeofは、データ型の大きさをバイト単位で求める単項の演算子です。

取得方法

配列全体のサイズを1つの要素のサイズで割ることで要素数を求めることができます。

sizeof(配列変数) / sizeof(配列変数[0]);

サンプル

配列の長さを求めて出力してみましょう。

#include <stdio.h>

int main(void) {

    // 配列の宣言・初期化
    int nums[] = {1, 2, 3};

    // 長さを求める
    int length = sizeof(nums) / sizeof(nums[0]);

    printf("要素数: %d\n", length);
}

実行結果

要素数: 3

配列とfor文

for文を使うことで配列の各要素にアクセスできます。とてもよく使われる組み合わせなのでしっかり覚えておきましょう!

for文の使い方【繰り返し処理】

配列の要素の合計値や平均値を求めたり、各要素に同じ関数を処理したりする際に使われます。以下のコードは、配列の合計値と平均値を求めています。

#include <stdio.h>

int main(void) {

    // 配列の宣言・初期化
    int nums[] = {9, 8, 7, 6};
    // 配列の合計値を求める変数
    int sum = 0;

    // 長さを求める
    int length = sizeof(nums) / sizeof(nums[0]);

    // for文を使って各要素をsumに追加
    for (int i = 0; i < length; i++){
        sum += nums[i];
    }

    // 合計値と平均値の出力
    printf("合計: %d\n", sum);
    printf("平均: %f\n", (float)sum / length);
}

実行結果

合計: 30
平均: 7.500000

for文の条件式で参照したい範囲のみを指定することで配列の要素を範囲ごとに処理することができます。

#include <stdio.h>

int main(void) {

    // 配列の宣言・初期化
    int nums[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

    // 3 <= N < 7の範囲の要素を出力
    for(int i = 3; i < 7; i++){
        printf("%d\n", nums[i]);
    }
}

実行結果

4
5
6
7

多次元配列

配列の要素として配列を持たせることで、多次元配列を生成することができます。ここでは2次元配列の使い方を見ていきましょう!

宣言

次元の数だけ[]を使って宣言します。

型名 変数名[要素数1][要素数2];

初期化

以下のように初期化します。

型名 変数名[要素数1][要素数2] = {{値1-1, 値1-2, ..., 値1-N}, {値2-1, 値2-2, ..., 値2-N}, ..., {値M-1, 値M-2, ..., 値M-N}};

改行することで見やすく初期化できます。

型名 変数名[要素数1][要素数2] = {
    {値1-1, 値1-2, ..., 値1-N},
    {値2-1, 値2-2, ..., 値2-N},
    ・
    ・
    ・ 
    {値M-1, 値M-2, ..., 値M-N}
};

最初の要素数のみ省略可能

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

宣言した要素数よりも初期化子が少ないとその分は0で初期化されます

int nums[2][2] = {};  // {{0, 0}, {0, 0}}

要素にアクセス

通常の配列同様に[]を使って要素にアクセスしますが、次元数だけ[]を重ねます。

変数[インデックス1][インデックス2];

それぞれの要素にアクセスして初期化・変更することもできます。

int nums[2][2];
nums[0][0] = 1;
nums[0][1] = 2;
nums[1][0] = 3;
nums[1][1] = 4;

サンプル

多次元配列を宣言・初期化して出力してみます。

#include <stdio.h>

int main(void) {

    // 多次元配列宣言・初期化
    int nums[3][2] = {
        {1, 2},
        {3, 4},
        {5, 6}
    };

    // 多重ループで出力
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 2; j++){
            printf("要素%d-%d: %d\n", i+1, j+1, nums[i][j]);
        }
    }
}

実行結果

要素1-1: 1
要素1-2: 2
要素2-1: 3
要素2-2: 4
要素3-1: 5
要素3-2: 6

まとめ

この記事では、C言語の配列について解説しました。

配列を使うことで値をまとめて管理でき、無駄に変数を生成しなくて済むので便利です。

また、配列には要素を数を動的に変更できる「動的配列」なるものも存在しています。気になる方は以下の記事を参照してください。

配列の要素数を実行時に変更する方法【動的配列】

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

View Comments

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago