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のオフィシャル記事は良記事。