ポインタの基本的概念

1.5 ポインタ変数と領域の初期化
 ポインタ変数を使用する場合は、その変数を使用する前に必ず初期化が必要です。なぜなら、ポインタ変数 ptr を宣言した時点では、下図のように何も有効なデータを指していないからです。

メモリ領域のイメージ

 また、ポインタ変数によって指される対象のメモリ領域は前もって用意しておく必要があります。それは、char *ptr によって確保されるのはアドレスを格納する箱が用意されるだけであり、*ptr によって参照する値が入っている箱が用意されるわけではないからです。よって、ptr = &data1; *ptr = 'a'; は正しいですが、*ptr = 'a'; は *ptr の領域を割り当てていないので、誤りとなります。後者のように data1 のような変数を用いない場合は、次の方法であらかじめ箱を用意しておく必要があります。
ptr = (char *)malloc(sizeof(char));
 これにより、文字型のデータの入る箱を1つ用意して、そのアドレスの値がポインタ変数 ptr に代入されることになります(詳しくは、4-2節「動的メモリ確保と強制型変換」を参照)。
 以上をまとめると、ポインタ変数を使用する場合には、次の2通りの初期化の方法があります。

1.他の変数のアドレスの代入による初期化
char data1, *ptr; 
ptr = &data1; 
この場合、*ptr は data1 と同じアドレスの値を指す。
2.malloc 関数(領域の動的割り当て)を用いた初期化
char *ptr; 
ptr = (char *)malloc(sizeof(char)); 
この場合、*ptr の値は不定なので、別途与える必要がある。