ポインタのポインタ


ポインタ自体も変数です。ですからメモリ内のどこかに置かれているはずです。そのポインタ変数が格納されているアドレスを指すポインタ変数(つまりポインタのポインタ)を作ることはできるのでしょうか。次の例を見て下さい。

ソースコード

源文件
  1|/* pointer04.c */                                                                     
  2|
  3|#include <stdio.h>
  4|
  5|int main(void)
  6|{
  7|  int a ;
  8|  int *p;
  9|  int **pp;
 10|
 11|  p = &a;
 12|  pp = &p;
 13|
 14|  **pp = 10;
 15|
 16|  printf("a = %d, *p = %d, **pp = %d\n", a, *p, **pp);
 17|
 18|  return 0;
 19|}

実行結果

a = 10, *p = 10, **pp = 10

11行目でポインタ p に変数 a の値を代入しています。そして12行目で、ポインタ p の値を pp に代入しています。さて、「**pp」はどのように解釈したらよいでしょうか。

間接参照演算子の結合規則は←(右結合)です。ということは、右側の * が優先されます。つまり「**pp」は

*(*pp)

ということになります。「*pp」は p の値(a のアドレス)です。とういうことは

*(p)

と同じです。結局、**pp に10を代入するということは、a に10を代入するということと同になるわけです。


ヌルポインタは、NULL と書き、特別なポインタを意味しています。文字通り解釈すると0番地を指しているポインタのことです。

C言語では、0番地は使わない約束になっており、もしポインタに0が格納されていたら、これは不正なポインタであることを意味します。

関数の戻り値としてポインタが返されることがよくありますが、関数が失敗したときなどに NULL を返すものがたくさんあります。したがってポインタを使うプログラムは、使うポインタが NULL になっていないとこをよく確かめる必要があります。

Chapte6 @ C言語目録 @ HomeWork List @ 昭亮's Homepage