[ create a new paste ] login | about

Link: http://codepad.org/eLu7AAiB    [ raw code | output | fork ]

C++, pasted on Jun 5:
//
// 参照とアドレスについて混乱している人へ (C++)
//

void func1(int *a)
{
	printf("1.ポインタ変数 a のアドレス = %X\n", (unsigned int)&a);
}

void func2(int &a)
{
	printf("2.参照として渡された 変数 a のアドレス = %X\n", (unsigned int)&a);
}

void proc_A()
{
	int a = 123;
	printf("●大元の実引数・変数 a のアドレス = %X\n", (unsigned int)&a);

	func1(&a);
	func2(a);
}

// 
// この例ではわかりやすく int で行っているが、当然他の型でも同じ事。
// 要点は、「アドレスを渡すのが参照渡し」では無いってこと。少なくとも、その一言では曖昧。
// 
// クリアにしなければならない大事な点、誤解してはいけない大事な点は、
// 
// 1.C++で追加された「参照」と言う機能は、ただの『エイリアス』であって
//   コンパイラレベルではそれは「アドレスを"きっと"渡しているだろう」が、
//   利用するプログラマレベルではそう思ってはいけない。
//
// 2.少なくとも 戻り値 関数(*型) に対して 関数(変数) や 関数(値) で呼び出した時、
//   その動作は、
// 
//    型 *変数 = &同型変数;
//
//   のように、アドレス(というunsigned 整数の即値)がコピーされている、と言う事。
//   ※「仮引数と実引数の違い」を確認の事
//

#define HR() printf("\n---------------------------------------------------------\n\n")

int main()
{
	proc_A(); HR();
	
	// 「参照」はただのエイリアスであるので、指すメモリ空間は大本と同じ。
	// ポインタを介した時、それは「ポインタ型変数にアドレスという値をコピーする処理」を介するので、
	// そのまた先にある値は同じでも、例えば関数などでやりとりする処理を書く時、今見ている実引数は全然違う存在となっている。
	// 
	// この事は、例えば「アドレス値をポインタ変数に取っておいて何かする」処理を書くような時や、
	// ポインタ変数によって、別のポインタ変数のアドレスを保持するような処理を書く時、気を付けないといけない。
	//
	
	return 0;
}


Output:
1
2
3
4
5
6
●大元の実引数・変数 a のアドレス = BF8762FC
1.ポインタ変数 a のアドレス = BF8762C4
2.参照として渡された 変数 a のアドレス = BF8762FC

---------------------------------------------------------



Create a new paste based on this one


Comments: