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

C言語入門:構造体の配列と構造体内の配列の違いを徹底解説

C言語プログラミングにおいて、構造体の最も一般的な活用例のひとつが構造体の配列です。

構造体の配列を宣言するには、まず対象となる構造体を定義し、続いてその型の配列変数を定義します。

例えば、次のように記述します。

struct book b[10];// 'book'型の構造体配列(要素数10)

例1:構造体の配列を使ったCプログラム

以下は、構造体の配列を利用したCプログラムの例です。3人の学生について、各科目の点数と合計点を管理しています。

struct marks{
    int sub1;
    int sub2;
    int sub3;
    int total;
};
main(){
    int i;
    struct marks student[3] = {{20,17,11,10},
        {175,23,169,10},
        {27,56,27,01}};
    struct marks total;
    for(i = 0; i <= 2; i++){
        student[i].total = student[i].sub1 +
        student[i].sub2 +
        student[i].sub3;
        total.sub1 = total.sub1 + student[i].sub1;
        total.sub2 = total.sub2 + student[i].sub2;
        total.sub3 = total.sub3 + student[i].sub3;
        total.total = total.total + student[i].total;
    }
    printf(" STUDENT TOTAL\n\n");
    for(i = 0; i <= 2; i++)
    printf("Student[%d] %d\n", i+1,student[i].total);
    printf("\n SUBJECT TOTAL\n\n");
    printf("%s %d\n%s %d\n%s %d\n",
        "Subject 1 ", total.sub1,
        "Subject 2 ", total.sub2,
        "Subject 3 ", total.sub3);
    printf("\nGrand Total = %d\n", total.total);
}

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

STUDENT TOTAL
Student[1] 48
Student[2] 367
Student[3] 110
SUBJECT TOTAL
Subject 1 4200462
Subject 2 96
Subject 3 223
Grand Total = 525

注意:出力の「Subject 1 4200462」のように異常に大きな値が表示されているのは、集計用の構造体変数 total を初期化せずに使っているためです。これは不定値(ゴミ値)であり、未定義動作の原因にもなります。実際の開発では struct marks total = {0}; のように必ずゼロで初期化しましょう。

例2:構造体内の配列を使ったCプログラム

次に、構造体のメンバとして配列を持たせるパターンを示します。各学生の3科目分の点数を1つの配列 sub[3] にまとめられるため、二重ループで集計処理を簡潔に記述できるのが特徴です。

main(){
    struct marks{
        int sub[3];
        int total;
    };
    struct marks student[3] =
        {145,50,11,10,175,50,19,10,20,30,25,10};
    struct marks total;
    int i,j;
    for(i = 0; i <= 2; i++){
        for(j = 0; j <= 2; j++){
            student[i].total += student[i].sub[j];
            total.sub[j] += student[i].sub[j];
        }
        total.total += student[i].total;
    }
    printf("STUDENT TOTAL\n\n");
    for(i = 0; i <= 2; i++)
    printf("Student[%d] %d\n", i+1, student[i].total);
    printf("\nSUBJECT TOTAL\n\n");
    for(j = 0; j <= 2; j++)
    printf("Subject-%d %d\n", j+1, total.sub[j]);
    printf("\nGrand Total = %d\n", total.total);
}

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

STUDENT TOTAL
Student[1] 216
Student[2] 254
Student[3] 85
SUBJECT TOTAL
Subject-1 4200548
Subject-2 130
Subject-3 71
Grand Total = 555

両者の違いのまとめ

  • 構造体の配列:同じ構造体型のデータ(複数の学生など)をひとまとまりとして扱います。科目ごとに sub1、sub2、sub3 といった個別のメンバが必要になります。
  • 構造体内の配列:構造体の中に配列メンバ(sub[3] など)を持たせることで、同種の複数データを1つのメンバで管理でき、for文による繰り返し処理と相性が良いのが魅力です。

科目数が増減する可能性がある場合や、同種のデータを大量に扱う場面では「構造体内の配列」の方が拡張性・可読性の面で有利です。用途に応じて適切に使い分けることが、効率的なCプログラミングへの第一歩となります。

  1. データ構造入門:多次元配列を表す「配列の配列」とは?仕組みと実装方法を解説

    多次元配列のもう一つの表現方法:「配列の配列」 データ構造において、多次元配列を扱う方法はいくつか存在します。本記事では、その中でも「配列の配列(Array of Arrays)」と呼ばれる表現方法について詳しく解説します。 この形式では、1つの親となる配列が、複数の配列それぞれの先頭アドレスを保持するという構造になっています。イメージとしては以下のようになります。 配列の配列の構造 上図は、サイズ [7 × 8] の2次元配列 x を表しています。この構造では、各行が独立した1次元配列として扱われ、最初の配列(親配列)がこれらの個々の配列へのアドレスを格納しています。 つまり、親配列の中身

  2. C言語の多次元配列とは?行優先・列優先の仕組みとサンプルコード

    多次元配列とは配列とは、同種のデータ(ホモジニアスなデータ)をまとめて管理するための基本的なデータ構造です。配列の要素は、メモリ上の連続した領域に順番に配置されます。しかし実際のプログラミングでは、1次元の配列だけでは不十分なケースが少なくありません。例えば、表形式のデータや行列を扱う場合には、2次元配列やさらに多くの次元を持つ多次元配列を作成する必要があります。行優先方式と列優先方式多次元配列をメモリ上に表現する方法には、大きく分けて2つのアプローチがあります。ひとつは行優先(Row-Major)方式、もうひとつは列優先(Column-Major)方式です。r行 c列の2次元配列を考えてみま