構造体とは
型の違う複数の変数をまとめて一つの型にしたものです。
単一の変数では、複数の情報を持つことができませんでした。
構造体を用いることでこれを解決することができます。
例えば、名前と定価を持つ商品や、大きさと方向を持つベクトルなども構造体で表すことができます。
構造体の使い方
struct 【構造体名】 { 【データ型】 【変数名】; … }
このように構造体を宣言し、
struct 【構造体名】 【変数名】 = {【初期値】, …}
このように構造体変数を宣言します。
構造体型の各データを参照するには、
【構造体名】.【変数名】
この各データのことをメンバといいます。
サンプルコード
struct_sample1.c
#include <stdio.h> struct human { char *name; unsigned age; }; int main(void) { struct human a, b, c; a.name = "Yamada"; a.age = 20; b.name = "Tanaka"; b.age = 16; c.name = "Suzuki"; c.age = 45; printf("%s %d歳\n", a.name, a.age); printf("%s %d歳\n", b.name, b.age); printf("%s %d歳\n", c.name, c.age); return 0; }
構造体のメンバとして構造体変数を定義する入れ子構造をとることも可能です。
struct_sample2.c
struct square { double height; double width; double x; double y; }
上記はxy平面上の長方形を定義した構造体の例です。x、yは左下の点の座標を表すとします。
これのx座標にアクセスするには、
struct_sample3.c
struct square s1; s1.x = 4;
とするのはわかりますね。
これを、「xy座標を示す点」を一つの構造体と見て書き直してみましょう。
struct_sample4.c
struct coordinates { double x; double y; } struct square { double height; double width; struct coordinates left_bottom; }
このようになりました。
この場合、x座標にアクセスするには、
struct_sample5.c
struct square s1; s1.left_bottom.x = 4;
となります。
表記は少し長くなりましたが、このようにすることでどこの点の座標なのかがわかりやすくなりました。
ただ、最初の長方形の例もそうですが、同じ型の変数を集めただけでは配列と変わりません。
名前をつけられる以上のメリットがないので使用目的に合わせてどちらが良いか考えるようにしましょう。