### 構造体とは
関連したいくつもの変数がある時、これをまとめて一つの名前だけで処理できるようにするもの
#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;
}