C言語の多重間接参照について
注意
んー…あまりよくわからないから明日にでもブログにまとめて誰かに見てもらおう…
— ゆず@社会人1年生 (@yuzu_441) April 19, 2016
書いてる本人は理解してません
学んだことをまとめる記事なので間違った情報が記載されている可能性があります
ご利用は計画的にです。
C言語勉強してます
最近C言語を勉強してて
多重間接参照が全然ピンと来なかったので言語化しようと書いてます
多重間接参照とは
多重間接参照(multiple indirection)は「ポインタのポインタ」らしい
ポインタのポインタって
これを調べてると、こんな感じのサンプルコードがよく出てくる(includeとか省略)
int *p; int **pp; int ary[] = {1,2,3,4,5}; p = ary; pp = &p; printf("%d", **pp); //=> 1が表示される
これがポインタのポインタです!(どやぁ
というのが多く見られるんですが、このコードにはなんの意味もない気が・・・
どういう時に使うのか
上のサンプルからじゃ何も察せない人種なので
実例というか使用例
データを関数の外へ出すのに使う
Google先生に聞いてみたところ 関数内で作られたデータを外へ出すのに使うらしい
とりあえずサンプルで関数内でint d
を定義して
そのint d
の値100
をmain
関数で表示したいと思います
まずは成功パターン
#include <stdio.h> void test(int**); int main() { int *p = NULL; test(&p); printf("%d\n", *p);//=>100 } void test(int **pp) { int d = 100; *pp = &d; }
これをこう書くと動かなくなる
(ポインタのポインタじゃない版)
#include <stdio.h> void test(int*); int main() { int *p = NULL; test(p); printf("%d\n", *p);//=>error: segmentation fault } void test(int *pp) { int d = 100; pp = &d; }
なぜ動かないのか
成功パターンの場合
test
関数にpを渡すときにアドレスを渡しているので
pp
にp
のアドレスhoge
が入ってポインタのポインタとして
p
にfuga
のアドレスが入り100を参照できる
失敗したパターン
p
の中は定義してから何も入れてないので空
test
関数へ渡す時にアドレスではなく中のアドレス値(空だけど)を
渡しているので、pp
からうまくp
に値を渡せずうまくいかない
まとめ
何故か研修で使ってるPCでgdb
が動かなくて辛い・・・
でも調べた感じ的にはあんまり間違ってないと思う