C言語 ポインタのポインタ

C言語改訂版2 はじめて学ぶCの仕組み (CD-ROM付) (プログラミング学習シリーズ)

C言語改訂版2 はじめて学ぶCの仕組み (CD-ROM付) (プログラミング学習シリーズ)

時系列解析でご無沙汰していたが、この問題を解決しなければならないので、Cの勉強を再開。ポインタとは「ショートカット」のようなものと理解した。そして、次のように表記して区別してきた。

  • ポインタ変数をpとする
  • *pで「ショートカット」の中身を表す
  • pで「ショートカット」のアドレスを表す
  • 「ショートカット」を作成するときは、p = &X のように書く(Xは任意の変数)

では、ポインタのポインタはどうなるのか。ちょっと実験。

#include <stdio.h>
main()
{
int a ;
int *p ;
int **pp ;

a = 10 ;
p = &a ;
pp = &p ;

printf("p = %d\n", p) ;        //1に対応
printf("*p = %d\n", *p) ;      //2に対応
printf("pp = %d\n", pp) ;      //3に対応
printf("*pp = %d\n", *pp) ;    //4に対応
printf("**pp = %d\n", **pp) ;  //5に対応

実行結果は次の通り。

p = -418909420    //1
*p = 10           //2
pp = -418909432   //3
*pp = -418909420  //4
**pp = 10         //5

上記の場合、

1:pにはaのアドレス(p = &a)が代入されているため、aのアドレスに対応するメモリの番号が出力される。

2:*pはショートカットの中身を指すから、aの値が出力される。

3:ppにはポインタ変数pのアドレス(pp = &p) が代入されているため、pのアドレスに対応するメモリの番号が出力される。

4:*ppはショートカットの中身を指す。*ppはpへのショートカットである。pの中身はaのアドレスであるから、aのアドレスに対応するメモリの番号が出力される。

5:**ppは*(*pp)、*ppはaのアドレスを意味するから、aのアドレスの中身である10が出力される。