閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

ポインタの参照

ポインタ変数を別の関数に渡して、その中でポインタを変更していたのですが、その操作が呼び出しもとのポインタ変数自体には影響が無いために少しはまりました。

func(char* ptr)
{
    // たとえばここでポインタを2つ進める
    ptr += 2;
}

char* ptr = string; 		// string も char*
func(ptr);

assert(ptr == string + 2); 	// エラー!

要するにポインタ変数そのものは、値渡しになっているので(この言い回しはおかしいかも)コピーが生成されて、うまく動かないということですね。これも少し考えれば当たり前のことなんですが…。これを意図した通りに動作させるには、参照を使用します。

func(char*& ptr) //< ここだけ変更
{
    ptr += 2;
}

char* ptr = string;
func(ptr);

assert(ptr == string + 2); 	// OK!

昔 *& なんてものを使っているコードを読んでも意味もわからない上にこんなものを使うことは未来永劫無いだろうと思っていましたが、自分から使うことになろうとは。また一歩変態への道を進んだ気がします。

参考
Google 検索: C++ 変態