C言語構造体

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

#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;
}