ポインター渡し
読み:ポインターわたし

 C/C++などにおける、関数への引数の渡し方の一つ。
目次

概要
 Cでは、値そのものか、値へのポインターのいずれかを引数として渡すことができる。前者を値渡し、後者をポインター渡しという。
 C++でもこの値の渡し方はそのまま維持されている。
 それより後に登場するモダンな言語はポインター変数を持たないので、同様の渡し方を参照を渡すように記述する「参照の値渡し」という値の渡し方が使われている。

特徴

使用例
 ポインター渡しで受ける側の関数は、引数をポインター変数として定義する。
 int hoge(int *var) { return *var; }
 関数を呼ぶ側は、原則として参照演算子(アドレス演算子)であるアンパサンド記号(&)を変数名に冠してアドレスの形にする必要がある。
 hoge(&foo);

配列
 配列変数の場合、&は付けても付けなくても良い。
 これは、C99なら§6.3.2.1などに記載があるが、配列は、普通に使えば殆どポインターに変換される存在だからである。
 従って配列変数に限り、以下3つの関数呼び出しは、全て同じアドレスが渡される。
 int foo[10];
 hoge(foo);
 hoge(&foo);
 hoge(&foo[0]);
 &を付ければ手動でポインターになるが、付けなくても自動でポインターになる。

ポインター
 ポインターを引数として与える場合、&は付けなくて良い。むしろ、付けてはいけない。
 但し、ポインター変数を引数に取る関数にポインター変数を渡すのは、ポインター渡しではなく値渡しである。
 従って、呼ばれた側の関数でポインター変数を操作しても、呼び出し元のポインター変数は変化しない。

再検索