ポインタのポインタがあるって聞いたけど、どうやって使うの?
ポインタのポインタって何?
そもそも、ポインタをよく理解できてない…
この記事を読めば、これらの悩みを解決できます。
ポインタのおさらい
ポインタを詳しく勉強したい人はこちらの記事を参考にしてください。
ポインタとは、他の変数のアドレス(住所)を参照することで、その変数の値を自身に代入することができる変数です。
「値」、「アドレス」の表し方は、普通の変数とポインタで異なります。変数=aの場合で、まとめてみます。
値、アドレスの表し方(変数)
変数での値の表し方 | a(そのまま) |
変数でのアドレスの表し方 | &a(&付ける) |
値、アドレスの表し方(ポインタ)
ポインタでの値の表し方 | *a(そのまま) |
ポインタでのアドレスの表し方 | a(*取る) |
まずは、ここをしっかり理解することが重要です。たとえば、ポインタ「*pa」で変数「a」のアドレスを参照する時、「pa=&a;」と表します。ここが理解できていれば基礎はOKです。
ポインタのポインタとは?
ポインタのポインタとは、他のポインタのアドレス(住所)を参照することで、そのポインタの値を自身に代入することができる変数です。つまり、ポインタの値を参照するので、ポインタのポインタと呼ばれています。実際には多重間接参照と呼ばれていますが、「ポインタのポインタ」で覚えてOKです。ポインタのポインタは**ppaのように「*」を2回続けることで表します。
では、ポインタのポインタ(**ppa)での「値」、「アドレス」の表し方をまとめてみます。
値、アドレスの表し方(ポインタのポインタ)
ポインタのポインタでの値の表し方 | **ppa(そのまま) |
ポインタのポインタでのアドレスの表し方 | *ppa(*取る) |
ポインタのポインタでのアドレスは、「*」を一つ取って表します。「通常のポインタ」と「ポインタのポインタ」のどちらでも、「値」はそのままで表し、「アドレス」は*を取って表すということが共通しています。正直言うと、これを覚えれば難しくないです。
ポインタのポインタを練習しよう!
実際にポインタのポインタを使う練習してみましょう。aに代入された値を*paで参照し、それを**paで参照するというプログラムです。先にアドレスを出力した後、値を出力してみます。
#include<stdio.h>
int main()
{
int a=5;
int* pa;
int** ppa;
pa = &a;
ppa = &pa;
printf("aのアドレス=%p",&a);
printf("¥na=%d",a);
printf("¥npaのアドレス=%p",pa);
printf("¥npa=%d", *pa);
printf("¥nppaのアドレス=%p",*ppa);
printf("¥nppa=%d",**ppa);
}
「%p」という出力書式を使って16進数でアドレスを出力しています。
実行すると、どれも値とアドレスが同じであることが分かります。
ポインタのポインタのポインタ
「ポインタのポインタが存在するってことは、ポインタのポインタのポインタもあるの??」と考えた方はいますか?
はい。実はポインタのポインタのポインタは存在します。さらに、ポインタのポインタのポインタのポインタもあります。
つまり、ポインタのアドレスを参照できる回数に限りはないので、ポインタは無限に存在するということになります。これらをまとめて多重間接参照と言います。
ポインタのポインタのポインタ「***pppa」を例に多重間接参照での値、アドレスの表し方をまとめます。
値、アドレスの表し方(多重間接参照)
多重間接参照での値の表し方 | ***pppa(そのまま) |
多重間接参照での値の表アドレス | **pppa(*取る) |
つまり、ポインタのポインタでも、ポインタのポインタのポインタのポインタのポインタでも、どれでも値を表すときはそのままで、アドレスを表すときは「*」を取って表すことになります。これがポインタを使う時の鉄則です!!
まとめ
ポインタやポインタに苦手意識を持っている人は、値の表し方とアドレスの表し方がごちゃ混ぜになっているんじゃないかと思います。表にしてまとめると分かりやすいいのでおすすめです。理解出来たら実際にプログラミングして覚えるようにしましょう。
コメント