//
// 参照とアドレスについて混乱している人へ (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;
}