童貞のプログラミング

童貞の頭の中を垂れ流します。

C言語のポインタについて 4.ポインタのポインタとは?

C言語のポインタについて4

1.そもそもポインタとは何か?
2.ポインタで出てくる&と*はなに?
3.宣言する型が違う場合どうなっているのか?

4.ポインタのポインタとは?

 

今回はポインタのポインタについて考えていきます。
ポインタのポインタとは文字通りで、今までは変数のアドレスをポインタに格納していましたが、そのポインタのアドレスを別のポインタに格納するというだけです。

例:今まで(普通のポインタ)

変数A

ポインタB(変数Aのアドレスを格納している)


例:今回(ポインタのポインタ)

変数A

ポインタB(変数Aのアドレスを格納している)

ポインタC(ポインタBのアドレスを格納している)

 

このポインタCのことをポインタのポインタといいます。
これによって何かいろいろできるようになるみたい


使い方は、今までと同じ要領で作ればできますが一部違います。

ポインタのポインタを定義するときは、*が増えます。

普通のポインタの時は int *XXXX; と定義しますが

ポインタのポインタの時は int **XXXX; と一つ増えます。

この*の数が違うとうまくいきません。

※ちなみにポインタのポインタのポインタを使う場合 int ***XXXX; とまた1つ*が増えます。この要領で、ポインタのポインタの・・・・と数が増えても同じようにすれば大丈夫。

 

実際にやってみます。

今回は

Aは変数

Bはポインタ(Aのアドレスを格納)

Cはポインタのポインタ(Bのアドレスを格納)

となっています。

f:id:SitimiMayo:20210128210627p:plain

ポインタのポインタのコード

f:id:SitimiMayo:20210128210650p:plain

ポインタのポインタの結果

一つ一つ見ていきます。

1行目は変数Aの値なので

A= 123

これであっています。

 

2行目は変数Aのアドレスなので
&A= 0x7fff3ff3fc9c

これでいいです。

 

3行目はBの値です。BはAのアドレスを格納しているので
B= 0x7fff3ff3fc9c

2行目と同じ値のこれであっています。

 

4行目はBの*(アドレスの中の値)なので、0x7fff3ff3fc9cのアドレスの中の値は変数Aの123となるので

*B= 123

これであっています。

 

5行目はBポインタのアドレスなので

&B= 0x7fff3ff3fc90

これでいいです。

 

ここまでは前座です。(普通のポインタを知っていればできます。)

ここからが今回のメインです。

 

6行目はCの値です。CにはBのアドレスを格納していますなので

C= 0x7fff3ff3fc90

5行目と同じ値のこれであっています。

 

7行目はCの*(アドレスの中の値→変数Bの値)なので、0x7fff3ff3fc90のアドレスの中の値は変数Bの0x7fff3ff3fc9cとなるので

*C= 0x7fff3ff3fc9c

これであっています。

 

★重要

8行目はCの**(アドレスの中の値の中の値)

→要はCの2個前のアドレスの値なので、1個前はBの値の0x7fff3ff3fc9cで、それのもう一つ前はAの値なので

**C= 123

このように変数Aの値の123が出てきます。

 

※ポインタのポインタのポインタになったときは***とすればいい。

 元の変数からポインタの数が増えた分だけ*を増やせばいい。

 

9行目はCのアドレスなのでこれでいいです。

&C= 0x7fff3ff3fca0

 

 

まとめ

1.ポインタのポインタは、ポインタのアドレスを格納する方法のこと

2.ポインタのポインタの宣言は【型 **変数名;】の形で宣言

例) int **XXXX;

3.ポインタのポインタから大もとの変数の値を見ることができる。

【**ポインタのポインタ;】この形で指定すれば、大もとの変数の値を指定できる。

例) **YYY;

4.ポインタが増えても同じように使える。

ポインタのポインタのポインタの宣言は

例) int ***XXXX;

ポインタのポインタのポインタからもとの変数の値を見るときは

例) ***YYY;

 

ポインタのポインタのポインタのポインタの宣言は

例) int ****XXXX;

ポインタのポインタのポインタのポインタからもとの変数の値を見るときは

例) ****YYY;

 

 追記

 2021年1月29日リンク先の追加しました。