oFがらみでC++勉強しています。
意味は分かってるんだけど、関数の引数として、
参照渡しとポインタ渡しがC++には存在している。
ちなみにCの時は関数の引数に対して参照渡しはなかった(はず)。
結果から行くと、
- ポインタ渡しの場合は、呼び出し側が引数として、アドレスを渡す必要がある。
- 参照渡しの場合は、呼び出し側が引数として、ままオブジェクトを渡す。
コードは、
//ポインタ渡し
FuncA(int *p)
{
*p = 2;
}
//参照渡し
FuncB(int &p)
{
// 参照=エイリアスなので、中身(値)は変更出来るが、
// アドレスは変更できない
p = 10;
}
void main()
{
int a = 1;
int* pa = &a;
// アドレスを渡す
FuncA(pa);
// まま変数を渡す
FuncB(a);
}
これは、全く問題なし!
あえて言うなら、参照は単なるエイリアスなので、
渡した引数のアドレスは変更できない。事に注意。
そして問題は次。ロベールのC++を読んでいて、こんなのが出てきた。
funcB( int*& pa )
{
// pa は、ポインタの参照です。
}
ポインタの参照??
C出身の私は、一瞬「ポインタのポインタ?」と思ったんですが、
結論としては、見たまんま。
ポインタの参照=ポインタのエイリアスです。
この関数を呼ぶ場合はfuncBの引数には、ポインタを与えます。
int *pa;
funcB(pa);
で、結局なに?
という事なんです。。。が。
- 引数にポインタ =ポインタを渡す
- 引数にポインタの参照 =ポインタを渡す
と、両パターンとも、ポインタを渡していることに代わりはない。
が、2のパターンでは、ポインタの参照(エイリアス)を渡しているので、
関数内で、渡したポインタの値(=アドレス)を変更する事が出来る!
1.でも関数内では、ポインタ(=アドレス)の変更は可能だが、
関数処理が終了したら、呼び出す前のポインタ(アドレス)をさしたまま。
こんな理解であっているのか…不安