C Advance5日目のまとめ

 

 

**構造体

作成するプログラムが複雑になっていくと、

一つの概念に対して複数の変数が割り当てられるようになる

ことがあります。

例えば学校で学生のデータベースなんかを作成する際、

その学生の学籍番号、名前、年齢などのデータを

ひとまとめにして扱うことがあります。

 

そのようなプログラムを作成する際に、

関連する変数がバラバラになっていると、

扱うのが非常に不便になってしまいます。

そこで便利になるのが構造体といったものになります。

構造体というのは、一言でいうと

複数の変数をひとまとめにするものです。

 

学籍番号を扱う整数型の変数id、

名前を扱うchar型の変数name、

年齢を扱う整数型の変数age、

をひとまとめにして構造体にすると以下のようになります。

struct student{
    int id;               // 学生番号
    char name[256]; // 名前
    int age;             // 年齢
};

 

このような構造体の定義のことを、

構造体テンプレートと呼びます。

structが構造体を表す記述になります。

そのあとのstudentというのが、構造体の名前になります。

構造体の名前は任意で決めることができます。

{}内に、ひとまとめにする変数を定義します。

最後に;で終了をします。

 

実際に作成した構造体を使用するには、

struct student data;

これで、dataという名前の構造体変数を定義できます。

 

実際にプログラムを記述して見てます。

Test501.c

実行結果

学籍番号:1 名前:TPY 年齢 18

 

構造体の成分の変数のことをメンバと言います。

このメンバには通常以下の方法でアクセスします。

構造体変数の成分へのアクセス

(構造体変数名).(メンバ)

 

上記のプログラムでは、構造体変数名がdataです。

そのメンバであるidへアクセスをするには、

間に.をつけてdata,idとします。

先頭にdataが付いているだけで、

それぞれの成分へのアクセスは、普通の変数と同じです。

 

**共用体

C言語には、

構造体に似ている共用体というものが存在します。

共用体とは、一つのメモリ領域に複数の変数を割り当てる

ことができる意味では、構造体と同じである。

しかし、使われ方が大きく異なる。

共用体を実際に用いたプログラムを以下に記述します。

Test502.c

実行結果

1 3.140000 Hello

 

上記のプログラムの4行目から8行目で共用体についての

定義をしています。

共用体の定義

union (共用体名){
    データ型 メンバー名;
・・・・
};

構造体と同じで、

共用体では、複数のメンバーを定義できます。

unionが共用体を表す記述になり、

その後に記述するのが共用体の名前になります。

最後は;で終了です。

定義の仕方も、使い方もを構造体と似ています。

共用体の定義

union student data;

これで、dataという名前の共用体変数を定義できます。

メンバーへのアクセスは構造体と同じです。

 

*共用体と構造体の違い

構造体では全てのメンバーに対して、同時に値を代入する

ことができる。

共用体では一つの変数に対し、どれか一つのメンバーしか

同時に使うことができません。

 

共用体のメモリサイズは、

メンバーの中の最も大きいものと等しくなっている。

上記の場合では文字列変数のsのサイズがこの共用体の一つの大きさになっている。

 

*共用体を使うメリット

共用体を使うことでメモリの節約をすることができます。

複数のデータ型を取る可能性のデータを

一つの配列にまとめておきたいとき、共用体を用いることで

管理が楽になり、メモリの節約をできます。

同じことを構造体でやると、

使っていないメンバーの分のメモリが使われてしまうので

効率的でなくなってしまう。

 

**構造体配列

構造体を配列にして用いる方法について説明をします。

以下のプログラムを記述してください。

Test503.c

実行結果

学生番号:1 名前:山田太郎 年齢:18
学生番号:2 名前:佐藤良子 年齢:19
学生番号:3 名前:太田隆 年齢:18
学生番号:4 名前:中田優子 年齢:18

 

*typedef

構造体名の変更

typedef struct student student_data;

先頭についているtypedefは、

既存の型に新しい名前を付ける際に記述する言葉で、

上記のプログラムの場合、

studentという構造体をstudent_dataという名前に、

変更をしている。

 

再定義した構造体でのデータの定義

student_data s;

先頭にstructを付けることなく、

構造体変数を定義することが可能になります。

 

続いて、構造体変数への値の代入について説明をします。

初期値の設定の場合14行目から19行目のように、

通常変数と同様に{}を用いて値を一度に複数定義することが

できます。

外側の{}中に定義する値の数だけ{}でメンバを定義して、

間を,で区切ります。

メンバの値の定義は、メンバの並び順に正しく代入する

必要があります。

 

次回では、構造体のポインタについて説明をしていきます。