ポインタ型とは、アドレスを記憶する変数の型のことを意味しています。
ポインタ型は、通常の型とは異なる側面を持っています。
それは、ポインタ型は、他の型から作り出される
派生型であるという点です。
なにやらわかりにくい説明ですが、実際にはそんなに難しいことではありません。
たとえば、int型の場合、これは独立した型です。他の型とは何の関係もありません。
それに対して、ポインタ型は、
他の型とポインタ型を合体させて作ります。
int型とポインタ型を合体させると、intへのポインタ型という型ができます。
double型の場合なら、doubleへのポインタ型が作り出されます。
また、intへのポインタ型にさらにポインタ型を合体させて、
intへのポインタのポインタ型という、多重のポインタ型を作ることすらできます。
要するに、ポインタ型は、他の型と合体しなければこの世には存在出来ないという、
いわば、寄生虫のような型なのです。
ところで、ポインタ型は、要するに
アドレスを記憶する変数の型です。
アドレスは、この章の始めで表示させたように、結局は整数値に過ぎません。
その整数値を記憶する型が、どうして他の型と合体する必要があるのでしょうか。
これには明確な理由があります。指定
アドレスに記憶された数値を取り出すためです。
たとえば、int型、double型、char型は、すべてサイズが違っています。
int型の場合、標準的なコンパイラでは4バイトのサイズですから、
億単位で存在するメモリというロッカーの4個分を使っていることになります。
int型の値を取り出すには、この4個をまとめて取り出さなくてはいけません。
型によっては、メモリに記憶された2進数の読み方まで違ってくることもあるので、
元々の型がなんだったのかがわからない限り、記憶された数値を取り出せないわけです。
つまり、ポインタ型は、
どんな型の変数のアドレスだったかわかる必要があります。
そこで、あらかじめ他の変数と合体した形でポインタ型として作っておけば、
そのポインタ型の変数に記憶された数値は、合体されている型であるとすぐわかります。
実際には、単独で存在するポインタ型としてvoid型があります。
この型は、どんな変数のアドレスでも記憶できますが、
元々の変数の型がわからないため、値を取り出すことができません。