構造体の定義の仕方について

榛名湖 C

今日は平和で集中できた1日でした。
職場でプログラミングをさせてもらえたのです!
やっぱりプログラムを組んでいる時間は楽しくてあっという間に過ぎていきますね〜。
書いていたプログラムは「名前と点数の構造体を作って、点数の降順にソートしてその結果を表示せよ」的な内容でした。
今日は上記課題の中で学んだ「構造体の宣言の仕方」についてお話ししていこうと思います!

今回学んだ構造体の宣言の仕方は3パターン。

  1. 教科書型
  2. 便利型
  3. 万能型

一つ一つ見ていきましょう!

教科書型

    struct data_a/*構造体タグ名*/ {     //構造体の宣言
    char name[10];     
    int math;
    int english;
    int science;
    double average;
    struct data_a *a;     //自己参照。ポインタ変数でないとエラー
    };

    struct data_a a;   //構造体型の宣言

教科書型はその名の通り、教科書で構造体と調べると出てくるであろう宣言方法です。
「 struct 構造体タグ名{メンバの型 メンバ名} ; 」で宣言されます。
この宣言以降「struct 構造体タグ名」がこの構造体の型名となります。
教科書型は実際の開発現場ではあまりつかわれませんが、以降で説明するよく使う宣言方法の原型になります。

便利型(typedef型)

    typedef struct {         //構造体の宣言
    char name[10];     
    int math;
    int english;
    int science;
    double average;
    struct data_b *b;     //自己参照。ポインタ変数でないとエラー
    } data_b/*構造体タグ名*/;

    data_b b;   //構造体型の宣言

便利型は構造体宣言以降に使う構造体の型名が、教科書型よりも簡易に記述できことにメリットがあります。
「 typedef struct {メンバの型 メンバ名}構造体タグ名 ; 」で宣言されます。
この宣言以降「構造体タグ名」がこの構造体の型名となります。

教科書型と違うところが三つあります。みなさんわかりますか?
一つ目は構造体の宣言の先頭に「typedef」が追加されています。「typedefとは何か」についての解説はみなさんの参考書に譲ります(^ ^)
二つ目は、構造体のタグ名が宣言のお尻に移動してますね。
三つ目は、この宣言以降「構造体タグ名」がこの構造体の型名となるところです。
教科書型に比べて「struct」が省略されている分、構造体宣言以降の型宣言を簡潔に行えます。

実務型

    typedef struct data_c1/*構造体タグ名_1*/ {    //構造体の宣言
    char name[10];     
    int math;
    int english;
    int science;
    double average;
    struct data_c1 *c1;     //自己参照。ポインタ変数でないとエラー
    struct data_c2 *c2;     //自己参照。ポインタ変数でないとエラー
    } data_c2/*構造体タグ名_2*/;

    data_c2 c2; //構造体型の宣言

実務型は宣言冒頭のstructの後と、{}の後にそれぞれ別の構造体タグ名を宣言します。
理由はよくわかりませんが今の職場ではこの形で構造体を宣言しています。実際にプログラムを組んで違いを検証する必要がありそうですね。(今はやりませんが)

まとめ

いろんな書き方があってややこしいですね。
記事を書きながら「一番使いやすそうなのは便利型だよなー」と思っていますが、実際の現場では最後に紹介した実務型で記述をしています。
僕がまだペーペーで実務型の良さを知らないだけなんでしょうか…

今回は以上!閲覧ありがとうございました!

コメント

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