参照

■概要

参照とは変数に別名を付ける機能のことです。
参照を使うことで同じアドレスを共有する変数を複数作成することができます。

●書式
	・書式例
		データ型 &変数名

	・具体例
		void main(void)
		{
			int xx = 0;
			int &yy = xx;

			printf("xxのアドレス = %d\n", &xx);
			printf("yyのアドレス = %d\n", &yy);
		}

		実行結果:
			xxとyyのアドレスが同じ値で表示される

	上の具体例のように参照を使用すると別の名前の変数でもアドレスは同じ値になります。
	アドレスが同じなので代入処理などを行うと全ての参照変数が変更されます。

●例
	void main(void)
	{
		int xx = 0;
		int &yy = xx;

		xx = 100;
		printf("xxに100を代入\n");
		printf("xx = %d\n", xx);
		printf("yy = %d\n", yy);

		yy = 10;
		printf("yyに10を代入\n");
		printf("xx = %d\n", xx);
		printf("yy = %d\n", yy);
	}

	実行結果:
		xxに100を代入
		xx = 100
		yy = 100
		yyに10を代入
		xx = 10
		yy = 10

	cpp_0005

■参照渡し

参照変数は関数の引数でも使用することができます。
この引数で参照を使用した関数のことを参照渡しと呼びます。
参照渡しで使用された引数を関数内で変更した場合、
呼び出し元の関数が変更されます。
それは、参照が呼び出し元の変数のアドレスを共有しているからです。

●書式
	・書式
		戻り値の型 関数名(データ型 &変数名)

	・具体例
		void InitParam(int &rhp, int &rmp)
		{
			rhp = 50;
			rmp = 10;
		}
			
		void main(void)
		{
			int hp = 0;
			int mp = 0;
			InitParam(hp, mp);

			printf("HP = %d\n", hp);
			printf("MP = %d\n", mp);
		}

		出力結果:
			HP = 50
			MP = 10

	cpp_0006

	上記のメモリイメージにありますが、参照渡しで渡された変数は
	関数内で別の名前で使用しています。
	呼び出しもとの変数と関数の変数はメモリ領域を共有しているので
	関数で変更を行うと呼び出しもとの変数の値も変更されます。

●参照渡しの注意点
	参照渡しは実引数の変数を仮引数で別名として使用する方法なので
	実引数と仮引数でメモリ領域は共有されています。
	なので、参照渡しには実体のある変数しか指定できません。
	値渡しのように直値を指定したらエラーになります。

	例:
		void InitParam(int &rhp, int &rmp)
		{
			rhp = 50;
			rmp = 10;
		}

		void main(void)
		{
			InitParam(50, 10); // エラー
		}

●const指定参照渡し
	参照渡しを使用して変数を関数に渡した際に
	関数内でその値を変更されたくない時は仮引数の指定時に「const」を指定します。
	const指定を行うことで仮引数の変数の値の変更は不可能となります。

	例:
		void PrintParam(const int &rhp, const int &rmp)
		{
			rhp = 50;	// エラー
			rmp = 10;	// エラー

			printf("HP = %d\n", rhp);
			printf("MP = %d\n", rmp);
		}

		void main(void)
		{
			int hp = 50;
			int mp = 10;
			PrintParam(hp, mp);
		}