C 言語 | ポインター | ポインターへのポインター
アドレスを保存するポインターも変数の一種であり、ポインター自身にもアドレスがある。アドレス演算子を使うと、ポインターのアドレス、つまりポインターへのポインターを取得できる。
ポインターのアドレス
ポインターは参照先のアドレスを表す数値を保存する変数の一種である。ポインターも変数であるため、ポインター自身のアドレスが存在する。つまり、あるポインターのアドレスを別のポインターに保存し、ポインターへのポインターを作成できる。
ポインターへのポインターは別のポインターを参照し、そのポインターから元の変数をさらに参照できる。多重間接参照はポインターを理解するうえで重要である。ポインターへのポインターを宣言するには、アスタリスク * をもう 1 つ追加する。
ポインターへのポインターの宣言
型 **変数名;
多重間接参照を行うには、参照する階層の数だけ間接演算子 * を指定する。参照回数が増えると処理速度にも影響するため、意味のない多重間接参照は避けるべきである。ただし、呼び出し元が所有するポインターを別の関数から変更したい場合には、ポインターへのポインターが役立つ。
#include <stdio.h>
int main() {
int iVariable = 100;
int *ip = &iVariable;
int **ipp = &ip;
printf("--ポインター ip が表す値--\n");
printf("アドレス = %p\n" , &ip);
printf("保存されたアドレス = %p\n" , ip);
printf("保存されたアドレスの内容 = %d\n\n" , *ip);
printf("--ポインターへのポインター ipp が表す値--\n");
printf("保存された値 = %p\n" , ipp);
printf("保存されたアドレスの内容 = %p\n" , *ipp);
printf("保存されたアドレスが示すアドレスの内容 = %d\n", **ipp);
return 0;
}
コード 1 では、整数 100 を保存する変数 iVariable、iVariable のアドレスを保存するポインター ip、そして ip のアドレスを保存するポインターへのポインター ipp を定義している。このプログラムは、ポインターとポインターへのポインターの関係を理解するため、各種の情報を表示する。表示されるアドレスは実行するたびに異なる。
アドレス演算子 & を使うと、ポインター ip のアドレスを取得できる。ipp はこの値を保存しているため、ip のアドレスと ipp に保存された値が同じであることを確認できる。また、ipp を間接参照すると、ip に保存された値を参照する。したがって、ipp が保存するアドレスの内容と、ip が保存するアドレスは一致する。
ポインターへのポインターから元の変数を参照するには、多重間接参照を行う。**ipp と記述すると、ipp が保存するアドレス、つまり ip をたどり、さらに ip が保存するアドレス、つまり iVariable を参照できる。