ポインタ渡しと参照渡し

openFrameworksで使用するC++言語の仕様に関して、

  • ポインタ渡しの場合は、呼び出し側が引数として、アドレスを渡す必要がある。
  • 参照渡しの場合は、呼び出し側が引数として、ままオブジェクトを渡す。
ポインタ渡しのコード

FuncA(int *p)
{
*p = 2;
}

参照渡しのコード

FuncB(int &p)
{
// 参照=エイリアスなので、中身(値)は変更出来るが、アドレスは変更できない
p = 10;
}

void main()
{
int a = 1;
int* pa = &a;

// アドレスを渡す
FuncA(pa);

// まま変数を渡す
FuncB(a);
}

以上で、問題なし。あえて言うなら、参照は単なるエイリアスなので、渡した引数のアドレスは変更できない事に注意する。

そして問題は次。ロベールのC++を読んでいて、下記のソースが出てくる。

1
2
3
4
funcB( int*& pa )
{
// pa は、ポインタの参照です。
}
ポインタの参照とはポインタのエイリアスにあたる。この関数を呼ぶ場合はfuncBの引数には、ポインタを与える。

で、結局

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

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

openFramewoksのオフィシャル記事は良記事。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>