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

C言語

この記事では、C言語の配列について解説します。配列を使うことで同じ型の要素をまとめて管理することができます。

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

配列の使い方

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

宣言

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

型名 変数名[要素数];

初期化

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

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

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

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

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

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

要素にアクセス

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

変数[インデックス];
POINT
  • インデックス0から始まります。
    int nums[] = {1, 2, 3};
    nums[0];  // 1
    nums[1];  // 2
    nums[2];  // 3
  • それぞれの要素にアクセスして初期化・変更することもできます。
    int nums[3];
    nums[0] = 1;
    nums[1] = 2;
    nums[2] = 3;
  • 範囲外のインデックスを指定してもエラーにはなりませんが、よくわからない値にアクセスしてしまいます。
    int nums[] = {1, 2, 3};
    printf("%d\n", nums[3]);
    // 466092055

サンプル

それでは簡単なサンプルを見てみましょう!

#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

注意

要素数には、できるだけマジックナンバーを使わないようにしましょう!マクロを使うことでマジックナンバーを使わずに要素数を定義できます。

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

int main(void) {

    int nums[LENGHT];
}

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

配列の長さを求めるには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文を使うことで配列の各要素にアクセスできます。

#include <stdio.h>

int main(void) {

    // 配列の宣言・初期化
    int nums[] = {9, 8, 7};

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

    // for文を使って出力
    for (int i = 0; i < length; i++){
        printf("%dつ目の要素: %d\n", i+1, nums[i]);
    }
}

実行結果

1つ目の要素: 9
2つ目の要素: 8
3つ目の要素: 7

指定した範囲の要素のみにアクセス

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

配列を複製する

for文または、memcpy関数を使うことで配列をコピーできます。

for文を使う方法

要素を1つずつ代入することで、同等の配列を生成できます。

#include <stdio.h>

int main(void) {

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

    // 要素を1つずつ代入
    for(int i = 0; i < 3; i++){
        copy_nums[i] = nums[i];
    }

    // 出力
    for(int i = 0; i < 3; i++){
        printf("%d\n", copy_nums[i]);
    }
}

実行結果

1
2
3

memcpy関数を使う方法

memcpy関数を使うことで、配列をコピーできます。

#include <stdio.h>
#include <string.h>

int main(void) {

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

    // コピー
    memcpy(copy_nums, nums, sizeof(int) * 3);

    // 出力
    for(int i = 0; i < 3; i++){
        printf("%d\n", copy_nums[i]);
    }
}

実行結果

1
2
3

多次元配列

配列の要素として配列を持たせることで多次元配列を生成することができます。ここでは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}
};
POINT
  • 最初の要素数のみ省略可能
    int nums[][2] = {
        {1, 2},
        {3, 4},
    };
  • 宣言した要素数よりも初期化子が少ないとその分は0で初期化されます
    int nums[2][2] = {};  // {{0, 0}, {0, 0}}

要素にアクセス

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

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

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

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言語の配列について解説しました。

今回のおさらい

  • 宣言 = 『型名 変数名[要素数];』 
  • 初期化 = 『型名 変数名 = {値1, 値2, …, 値N};
  • アクセス = 『変数名[インデックス(添字)]
  • 配列の長さ = 『sizeof(配列) / sizeof(配列[0]);

配列を使うことで無駄に変数を生成しなくて済むので便利です。また、配列には動的配列なるものも存在しています。

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

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

タイトルとURLをコピーしました