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 を保存する変数 iVariableiVariable のアドレスを保存するポインター ip、そして ip のアドレスを保存するポインターへのポインター ipp を定義している。このプログラムは、ポインターとポインターへのポインターの関係を理解するため、各種の情報を表示する。表示されるアドレスは実行するたびに異なる。

アドレス演算子 & を使うと、ポインター ip のアドレスを取得できる。ipp はこの値を保存しているため、ip のアドレスと ipp に保存された値が同じであることを確認できる。また、ipp を間接参照すると、ip に保存された値を参照する。したがって、ipp が保存するアドレスの内容と、ip が保存するアドレスは一致する。

ポインターへのポインターから元の変数を参照するには、多重間接参照を行う。**ipp と記述すると、ipp が保存するアドレス、つまり ip をたどり、さらに ip が保存するアドレス、つまり iVariable を参照できる。