「がんばれない」けど「がんばりたい」

ITエンジニアの仕事のこと。AI、機械学習、ディープラーニング。地頭力。車のこと。

C++「ポインタの参照渡し」と「ポインタ渡し」

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);

で、結局なに? という事なんです。。。が。

  1. 引数にポインタ    =ポインタを渡す
  2. 引数にポインタの参照 =ポインタを渡す

と、両パターンとも、ポインタを渡していることに代わりはない。 が、2のパターンでは、ポインタの参照(エイリアス)を渡しているので、

関数内で、渡したポインタの値(=アドレス)を変更する事が出来る! 1.でも関数内では、ポインタ(=アドレス)の変更は可能だが、 関数処理が終了したら、呼び出す前のポインタ(アドレス)をさしたまま。

こんな理解であっているのか…不安