~初心者のプログラミング言語学習記~ サトルのC言語学習再挑戦!

「C言語」の「構造体」の仕組みを学ぼう!

以前に「C言語」を学んだ時にはたぶんスルーしていたような気がするのですが、今回は「構造体」という機能について学んでいきたいと思います。

あともう少しと思いながら「C言語」を学んでいるのですが、思っていたよりもたくさんの機能があるので、「学び甲斐」があって、前よりは少し「C言語」にも慣れてきた気がします。

それでは、「構造体」の機能について勉強していきたいと思います!

「構造体」の仕組みと作り方

名前だけを聞くとどんな機能なのかあまりイメージができなかったのですが、「さまざまなデータ型」のデータをまとめて扱うことができる機能のようです。

それなら「配列でもいいんじゃないかな?」と思っていたのですが、よく考えてみると「配列」は「同じデータ型」のデータしか扱えない機能でした。

では、どうやってさまざまなデータ型のデータをまとめていくことができるんでしょうか。

「構造体」を作るためには、

struct 構造体名 {
    データ型 データ名;
    データ型 データ名;
    データ型 データ名;
}

と書いていくのですが、

「人間」を表す「構造体」を作ってみると、

struct human {
    char name[50];
    int age;
};

他にも、「性別」「職業」「趣味」などいろんな項目を作れそうです。

「構造体」を利用したプログラムは、

#include <stdio.h>

// 「構造体」を作る
struct human {
	char name[50];
	int age;
};

int main(void) {
    // 「構造体」の内容を設定する
    struct human employee_1 = { "田中敏夫", 51 };

    // 「構造体」の内容を表示する
    printf("名前=%s\n", employee_1.name);
    printf("年齢=%d\n", employee_1.age);

    return 0;
}

のようになります。

このプログラムを実行すると、

名前=田中敏夫
年齢=51

のように表示されます。

データをまとめてグループ化できるような使い方ができますね。

同種のデータを複数扱う時は便利な機能だと思います。

「構造体データ」の配列での利用方法

「構造体」のデータを「配列」に格納して利用することもできます。

#include <stdio.h>

struct human {
	char name[50];
	int age;
};

int main(void) {

    // 「構造体」を作る
    struct human employee_1 = { "田中敏夫", 51 };
    struct human employee_2 = { "橋本菜々美", 27 };
    struct human employee_3 = { "山本耀司", 35 };

    // 「構造体」のデータを格納する配列を作る
    struct human humans[3];

    // 「配列」にデータを格納する
    humans[0] = employee_1;
    humans[1] = employee_2;
    humans[2] = employee_3;

    // 「構造体」の内容を表示する
    printf("名前=%s\n", humans[0].name);
    printf("年齢=%d\n", humans[0].age);

    printf("名前=%s\n", humans[1].name);
    printf("年齢=%d\n", humans[1].age);

    printf("名前=%s\n", humans[2].name);
    printf("年齢=%d\n", humans[2].age);

    return 0;
}

う~ん。これだとデータ数が増えたら「printf」関数がどんどん増えてしまいますね・・・

何か良い方法が無いかいろいろと調べていたら、「for文」を使うと、「配列」に対して一気に処理ができるとありました。

ただ、「配列の要素の個数」をどうやって取得すればいいのかがわからず、またいろいろ調べていき、「sizeof」という演算子を使うと、「データ型」のサイズや「変数」のサイズを調べることができるみたいです。

この「sizeof」演算子を使うことで、「配列の要素の個数」を調べることができます。

例えば、「int型」のデータが必要とするデータサイズを調べたい場合は、

#include <stdio.h>

int main(void){

    int i=0;

    int size = sizeof(i);

    printf("int型のデータサイズ=%d",size);

    return 0;
}

のように書いて実行すると、

int型のデータサイズ=4

のように表示されるので、int型は「4」バイト使っていることがわかりますね。

「配列の要素の個数」を調べる

そして、構造体のデータを取得するときには、「構造体」に「別名」を割り当ててあげないと、「配列の要素の個数」を取得することができませんでした。

「構造体」の別名を付けるためには、

struct 構造体名 {
    データ型 データ名;
    データ型 データ名;
    データ型 データ名;
}構造体の別名;

ように最後に「構造体の別名」を書くだけで別名を付けることができます。

今回は、「Human」という別名を付けることにしました。

別名を利用して、「配列の要素の個数」を取得するプログラムと、構造体の内容を表示するプログラムは、

#include <stdio.h>

struct human {
	char name[50];
	int age;
}Human;

int main(void) {

    // 「構造体」を作る
    struct human employee_1 = { "田中敏夫", 51 };
    struct human employee_2 = { "橋本菜々美", 27 };
    struct human employee_3 = { "山本耀司", 35 };

    // 「構造体」のデータを格納する配列を作る
    struct human humans[3];

    // 「配列」にデータを格納する
    humans[0] = employee_1;
    humans[1] = employee_2;
    humans[2] = employee_3;

    int size = sizeof(humans) / sizeof(Human);

    printf("配列データ個数=%d\n",size);

    for ( int i = 0; i < size; i++){
        // 「構造体」の内容を表示する
        printf("名前=%s\n", humans[i].name);
        printf("年齢=%d\n", humans[i].age);
    }

    return 0;
}

このプログラムを実行してみると、

配列データ個数=3
名前=田中敏夫
年齢=51
名前=橋本菜々美
年齢=27
名前=山本耀司
年齢=35

のように表示されます。

配列の要素の個数を取得している部分は、

int size = sizeof(humans) / sizeof(Human);

の部分ですが、

sizeof(humans)

で、「配列のデータサイズ」を取得し、

sizeof(Human)

の部分で、「構造体データ1つ分のデータサイズ」を取得しています。

なので、この2つの値を割ることで、「配列の要素の個数」を取得することができます。

「Javascript」だと「lengthプロパティ」を使えばすぐにわかるんだけど、このへんも手間がかかります・・・

プログラムを書く時の手間は「慣れる」しか無いので、どんどんプログラムを書いて「構造体」の作り方を習得していきたいと思います。

そろそろ「C言語」で何を作るのかを考えないとな~・・・

→(前へ)「C言語」で「ランダムな値(乱数)」を取得する方法

→(次へ)「ポインタ」の仕組みと使い方を学んでみる

→「Twitter:@satoru78888」

HOMEへ