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のサイズがこの共用体の一つの大きさになっている。
*共用体を使うメリット
共用体を使うことでメモリの節約をすることができます。
複数のデータ型を取る可能性のデータを
一つの配列にまとめておきたいとき、共用体を用いることで
管理が楽になり、メモリの節約をできます。
同じことを構造体でやると、
使っていないメンバーの分のメモリが使われてしまうので
効率的でなくなってしまう。
**構造体配列
構造体を配列にして用いる方法について説明をします。
以下のプログラムを記述してください。
実行結果
学生番号:1 名前:山田太郎 年齢:18
学生番号:2 名前:佐藤良子 年齢:19
学生番号:3 名前:太田隆 年齢:18
学生番号:4 名前:中田優子 年齢:18
*typedef
構造体名の変更
typedef struct student student_data;
先頭についているtypedefは、
既存の型に新しい名前を付ける際に記述する言葉で、
上記のプログラムの場合、
studentという構造体をstudent_dataという名前に、
変更をしている。
再定義した構造体でのデータの定義
student_data s;
先頭にstructを付けることなく、
構造体変数を定義することが可能になります。
続いて、構造体変数への値の代入について説明をします。
初期値の設定の場合14行目から19行目のように、
通常変数と同様に{}を用いて値を一度に複数定義することが
できます。
外側の{}中に定義する値の数だけ{}でメンバを定義して、
間を,で区切ります。
メンバの値の定義は、メンバの並び順に正しく代入する
必要があります。
次回では、構造体のポインタについて説明をしていきます。



