C言語 ポインタのポインタ
C言語改訂版2 はじめて学ぶCの仕組み (CD-ROM付) (プログラミング学習シリーズ)
- 作者: 倉薫
- 出版社/メーカー: 翔泳社
- 発売日: 2009/02/13
- メディア: 大型本
- 購入: 2人 クリック: 6回
- この商品を含むブログ (3件) を見る
時系列解析でご無沙汰していたが、この問題を解決しなければならないので、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が出力される。