// ありがちなミス int gHoge; // hogeにgHogeをセットする void setHoge(int *hoge) { // 仮引数(ローカル変数)hogeの参照がセットされるだけ hoge = &gHoge; } int main(void) { int *hoge = NULL; setHoge(hoge); // hoge == NULL のまま ... }
こういう、関数の中でポインタに参照をセットするような場合にはダブルポインタ渡しにしないといけませんね。
int gHoge; // hogeにgHogeをセットする void setHoge(int **hoge) { // 呼び出し元のhogeの参照がセットされる *hoge = &gHoge; } int main(void) { int *hoge = NULL; setHoge(&hoge); // hoge == &gHoge となる ... }
まとめると、
値渡し | 呼び出し元に変化なし |
ポインタ渡し | 呼び出し元の値を変更できる。参照に変化なし また、配列を渡して各々の値を変更できる。 |
ダブルポインタ渡し | 呼び出し元参照も変更できる。 また、ポインタ配列を渡して各々の参照を変更できる。 |