構造体

■構造体とは

	構造体とは複数の変数をひとつにまとめたデータ構造のことです。
	C_0044
	プログラムを作っていく上でRPGのキャラ情報や学生の成績情報など、
	データをまとめて管理したほうが効率的になるような状況が多々あります。
	そのような時にデータをまとめて管理するための方法のひとつとして構造体があります。
	構造体の要素(変数)一つ一つのことをメンバ、またはメンバ変数といいます。

■構造体の宣言

	構造体を作成する場合は、まずは枠組みを作り、そこに変数を追加します。

		構造体宣言の書式例:
			struct 構造体名
			{
				型 変数名;
			};

		構造体宣言の具体例:
			// RPGのパラメータ構造体化
			struct Parameter
			{
				char m_Name[16]; 	// 名前
				int m_Hp;		// HP
				int m_Mp;		// MP
				int m_At;		// 攻撃力
				int m_Def;		// 守備力
			};

		構造体宣言はまず「struct 構造体名」から始まり、「{」と「};」で閉じます。
		「}」の後ろには「;」が必要ですので忘れないように注意してください。
		そして「{};」の中にメンバを宣言していきます。

■構造体の使用

	構造体を実際に使用する場合は次のようにして使用します。

		使用例:
			// RPGのパラメータ構造体化
			struct Parameter
			{
				char m_Name[16]; 	// 名前
				int m_Hp;		// HP
				int m_Mp;		// MP
				int m_At;		// 攻撃力
				int m_Def;		// 守備力
			};

			/*
				パラメータの表示

				内容:
					引数で渡されたパラメータ構造体を
					画面に表示する
			*/
			void DispParameter(struct Parameter param)
			{
				printf("%sのパラメータ\n", param.m_Name);
				printf("HP = %d\n", param.m_Hp);
				printf("MP = %d\n", param.m_Mp);
				printf("攻撃力 = %d\n", param.m_At);
				printf("守備力 = %d\n", param.m_Def);
			}

			void main(void)
			{
				struct Parameter param;
	
				// 構造体データの初期化
				strcpy(param.m_Name, "山田太郎");
				param.m_Hp = 100;
				param.m_Mp = 50;
				param.m_At = 5;
				param.m_Def = 3;
				DispParameter(param);
			}

			実行結果:
				山田太郎のパラメータ
				HP = 100
				MP = 50
				攻撃力 = 5
				守備力 = 3

		構造体を使用する場合、「struct 構造体名 構造体変数名」で宣言を行います。
		上のソースコードでは「struct Parameter param;」がそれに当たります。
		構造体のメンバ変数を使用したい場合は「構造体変数名.メンバ変数名」で
		使用することが可能です。
		メンバ変数は通常の変数と同様に代入や計算ができます。

■メンバ変数初期化方法

	メンバ変数の初期化は以下のように構造体宣言時に行うことも可能です。

		初期化例:
			// RPGのパラメータの初期化(名前, HP, MP, 攻撃力, 守備力)
			struct Parameter param = { "山田太郎", 100, 50, 5, 3 };

	構造体の初期化は「構造体名 = { メンバ変数名 = 初期値 …… };」で行えます。
	初期化する順番は構造体宣言をしているメンバ変数の上から順番に行っていきます。
	Parameter構造体の場合、名前、HP、MP、攻撃力、守備力の順番です。

■構造体のポインタ

	構造体もポインタとして扱うことが可能です。
	構造体型のポインタ変数を用意してそこへ構造体のアドレスを代入します。
		アドレス代入例:
			// RPGのパラメータ構造体化
			struct Parameter
			{
				char m_Name[16]; 	// 名前
				int m_Hp;		// HP
				int m_Mp;		// MP
				int m_At;		// 攻撃力
				int m_Def;		// 守備力
			};

			void main(void)
			{
				struct Parameter prm = { "山田太郎", 100, 50, 5, 3 };
				struct Parameter *p_param;	
				p_param = &prm;	// p_paramにprmのアドレスを代入
			}

	構造体のポインタ型の場合、メンバのアクセス方法が変わります。
	通常は「構造体.メンバ」ですが、ポインタ型では「構造体->メンバ」になります。
	「.」が「->」に変わっていますので気をつけてください。
	「->」のことをアロー演算子と呼びます。
		ポインタ型の構造体へのアクセス例:
			// RPGのパラメータ構造体化
			struct Parameter
			{
				char m_Name[16]; 	// 名前
				int m_Hp;		// HP
				int m_Mp;		// MP
				int m_At;		// 攻撃力
				int m_Def;		// 守備力
			};

			void main(void)
			{
				struct Parameter prm = { "山田太郎", 100, 50, 5, 3 };
				struct Parameter *p_param;
				p_param = &prm;	// p_paramにprmのアドレスを代入

				int hp = p_param->m_Hp;
				p_param->m_Mp = 80;

				printf("hp = %d\n", hp);
				printf("mp = %d\n", prm.m_Mp);
			}
			実行結果:
				hp = 100
				mp = 80