### 構造体とは
関連したいくつもの変数がある時、これをまとめて一つの名前だけで処理できるようにするもの
#include <stdio.h> #include <string.h> struct Person { char name[40]; int height; int weight; }; void dataout(struct Person ps){ printf("name=%s height=%d weight=%d\n", ps.name, ps.height, ps.weight); } int main(void){ struct Person dt, dt2; strcpy(dt.name, "tanaka kenichi"); dt.height = 180; dt.weight = 70; dt2 = dt; dataout(dt2); return 0; }
$ ./dev
name=tanaka kenichi height=180 weight=70
### 構造体の宣言
構造体はintやcharなどの基本データ型を好きなように組み合わせて新しいデータ型として扱うもの
struct 構造体名 {
必要な変数宣言の並び;
};
構造体は初期化することもできる
構造体の宣言はプログラムの先頭部分に記述する
構造体のメンバを指定する時は、2種類のメンバアクセス演算子を使う
-> 変数名で操作する時は”.”
-> ポインタで操作する時は”->”
#include <stdio.h> #include <string.h> struct Person { char name[40]; int height; int weight; }; int main(void){ struct Person d1, d2; struct Person *p = &d2; strcpy(d1.name, "tanaka kenichi"); d1.height = 180; d1.weight = 70; strcpy(p->name, "suzuki tomomi"); p->height = 160; p->weight = 60; printf("%s %d %d\n", d1.name, d1.height, d1.weight); printf("%s %d %d\n", p->name, p->height, p->weight); return 0; }
### 構造体の引数渡し
#include <stdio.h> struct myst { int d1, d2; }; struct myst add(struct myst x, struct myst y){ struct myst wk; wk.d1 = x.d1 + y.d1; wk.d2 = x.d2 + y.d2; return wk; } int main(void){ struct myst a, b = {10, 20}, c = {100, 200}; a = add(b, c); printf("%d %d\n", a.d1, a.d2); return 0; }
### 共用体
メモリ上の同じアドレスを複数の変数で共用すると言う機能
キーワードがstructではなくunionになる
union MyType { char ch; int n1; int n2; }; int main(void){ union MyType dt; dt.n1 = 0x41424344; printf("dt.ch=%X\n", dt.ch); printf("dt.n1=%X\n", dt.n1); printf("dt.n2=%X\n", dt.n2); return 0; }
$ ./dev
dt.ch=44
dt.n1=41424344
dt.n2=41424344
### 列挙型
名前付き定数を使って、データの取り得る値を全て列挙したもの
enum RetType {YES, NO, CANCEL}; int main(void){ enum RetType ret; ret = YES; if (ret == YES) printf("ret is yes\n"); else if (ret == NO) printf("ret is no\n"); else if (ret == CANCEL) printf("ret is cancel\n"); printf("%d %d %d\n", YES, NO, CANCEL); return 0; }