Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語の配列初期化入門:コンパイル時初期化と実行時初期化の違いをわかりやすく解説

C言語において、配列の初期化方法は大きく分けて「コンパイル時初期化」と「実行時初期化」の2種類があります。この記事では、配列の基本概念をおさらいしながら、それぞれの初期化方法の特徴や構文、具体的なサンプルコードと実行結果を交えて詳しく解説します。

配列とは

配列とは、連続したメモリ領域に格納された複数のデータ(要素)の集合体です。各要素には「添字(インデックス)」を使ってアクセスできます。同じ型のデータをまとめて効率的に扱えるため、C言語プログラミングの基礎となる重要な概念です。

コンパイル時初期化(静的初期化)

コンパイル時初期化では、配列の値をソースコードの中に直接記述します。考え方は通常の変数の初期化と同じで、プログラムの実行前にすべての値が確定します。一般的な構文は以下のとおりです。

構文

type name[size] = { 値のリスト };

// int型配列の初期化
int rollnumbers[4] = { 2, 5, 6, 7 };

// float型配列の初期化
float area[5] = { 23.4, 6.8, 5.5, 7.3, 2.4 };

// char型配列(文字列)の初期化
char name[9] = { 'T', 'u', 't', 'o', 'r', 'i', 'a', 'l', '\0' };

サンプルプログラム

次のCプログラムは、コンパイル時に初期化した配列の全要素をforループで表示します。

#include <stdio.h>

int main(void) {
    // コンパイル時初期化による配列の宣言
    int array[5] = {1, 2, 3, 4, 5};
    int i;

    printf("配列の要素を表示:");
    for (i = 0; i < 5; i++) {
        printf("%d ", array[i]);
    }
    return 0;
}

実行結果

配列の要素を表示:1 2 3 4 5

実行時初期化(動的初期化)

実行時初期化では、プログラムの実行中にユーザーが入力した値で配列を初期化できます。そのため、実行するたびに異なる値を扱うことが可能です。大きなサイズの配列や、ユーザーが指定した値で初期化したい場合に適しており、scanf()関数などを使ってキーボードから値を読み込みます。

サンプルプログラム

次のCプログラムは、実行時に入力した2つの2次元配列A・Bについて、対応する要素同士の和と積を計算して表示します。

#include <stdio.h>

int main(void) {
    // 実行時に入力する値を格納する配列を宣言
    int A[2][3], B[2][3], sum[2][3], product[2][3];
    int i, j;

    // 配列Aに要素を入力
    printf("配列Aの要素を入力してください:\n");
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 3; j++) {
            printf("A[%d][%d] : ", i, j);
            scanf("%d", &A[i][j]);
        }
    }

    // 配列Bに要素を入力
    printf("配列Bの要素を入力してください:\n");
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 3; j++) {
            printf("B[%d][%d] : ", i, j);
            scanf("%d", &B[i][j]);
        }
    }

    // 和の計算と表示
    printf("和の配列:\n");
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 3; j++) {
            sum[i][j] = A[i][j] + B[i][j];
            printf("%d\t", sum[i][j]);
        }
        printf("\n");
    }

    // 積の計算と表示
    printf("積の配列:\n");
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 3; j++) {
            product[i][j] = A[i][j] * B[i][j];
            printf("%d\t", product[i][j]);
        }
        printf("\n");
    }
    return 0;
}

実行例

配列Aの要素を入力してください:
A[0][0] : 1  A[0][1] : 2  A[0][2] : 3
A[1][0] : 4  A[1][1] : 5  A[1][2] : 6
配列Bの要素を入力してください:
B[0][0] : 7  B[0][1] : 8  B[0][2] : 9
B[1][0] : 1  B[1][1] : 2  B[1][2] : 3

和の配列:
8	10	12
5	7	9

積の配列:
7	16	27
4	10	18

両者の違いを比較

項目コンパイル時初期化実行時初期化
値の決定タイミングコンパイル時(ソースコード内に記述)実行時(ユーザー入力)
柔軟性低い(値は固定)高い(実行ごとに変更可能)
主な用途小規模な固定データの管理大規模配列や対話的な処理

まとめ

コンパイル時初期化は、値があらかじめ決まっている小さな配列に向いたシンプルな手法です。一方、実行時初期化は、ユーザーの入力に応じて柔軟に値を設定できるため、実用的なアプリケーションで広く使われています。用途に応じて2つの初期化方法を使い分けることで、より読みやすく保守性の高いCプログラムを書けるようになります。なお、本記事のコードでは標準に従い、main関数の戻り値をint型としています。

  1. C言語入門:モノリシックプログラミングとモジュラープログラミングの違いを徹底解説

    本記事では、C言語におけるモノリシックプログラミングとモジュラープログラミングの違いを、それぞれのメリット・デメリットとともに詳しく解説します。 モノリシックプログラミングとは プログラム全体を1つの関数、すなわちmain関数だけですべて記述する方式を「モノリシック(一枚岩)型プログラミング」と呼びます。しかし、すべてのロジックを単一の関数に詰め込むのは、良いプログラミングスタイルとは言えません。 デメリット モノリシックプログラミングには、以下のような欠点があります。 プログラムが非常に大きく、複雑になりやすい。 デバッグ、テスト、保守が非常に困難になる。 モジュラープログラミングとは

  2. 配列の左回転をO(n)時間・O(1)空間で実現するC++プログラムの書き方

    本記事では、サイズnの整数配列と複数の回転位置kが与えられたとき、指定されたインデックスkから配列を左方向へ回転させた結果を出力する方法を、時間計算量O(n)・空間計算量O(1)の制約のもとで解説します。 配列の左回転とは、各要素を左へk個分ずらし、はみ出した要素を右端に折り返して配置する操作です。例えば、配列 {1, 2, 3, 4, 5} を1回左に回転すると {2, 3, 4, 5, 1} になります。 この手法の鍵となるのは剰余演算(%)です。回転後の配列を新たに作成することなく、インデックス計算だけで結果を直接出力できるため、追加のメモリ領域を一切必要としません。 入力例と出力例