ポインタ変数を使用する場合は、その変数を使用する前に必ず初期化が必要です。なぜなら、ポインタ変数 ptr を宣言した時点では、下図のように何も有効なデータを指していないからです。
また、ポインタ変数によって指される対象のメモリ領域は前もって用意しておく必要があります。それは、char *ptr によって確保されるのはアドレスを格納する箱が用意されるだけであり、*ptr によって参照する値が入っている箱が用意されるわけではないからです。よって、ptr = &data1; *ptr = 'a'; は正しいですが、*ptr = 'a'; は *ptr の領域を割り当てていないので、誤りとなります。後者のように data1 のような変数を用いない場合は、次の方法であらかじめ箱を用意しておく必要があります。これにより、文字型のデータの入る箱を1つ用意して、そのアドレスの値がポインタ変数 ptr に代入されることになります(詳しくは、4-2節「動的メモリ確保と強制型変換」を参照)。ptr = (char *)malloc(sizeof(char));
以上をまとめると、ポインタ変数を使用する場合には、次の2通りの初期化の方法があります。
1.他の変数のアドレスの代入による初期化2.malloc 関数(領域の動的割り当て)を用いた初期化char data1, *ptr; ptr = &data1;この場合、*ptr は data1 と同じアドレスの値を指す。char *ptr; ptr = (char *)malloc(sizeof(char));この場合、*ptr の値は不定なので、別途与える必要がある。
- ポインタ変数の初期化の復習を兼ねて、次のプログラムの間違いを指摘してください。
#include <stdio.h> int main(void) { int data, *ptr; data = 10; *ptr = data; printf ("==%d==%d==\n", *ptr, data); }
このプログラムの間違いは、ポインタ変数で指し示す領域が割り当てられていないことです。よって、ポインタ変数への代入(*ptr = …)の前に、次のメモリ領域を割り当てる文を挿入する必要があります。ptr = (int *)malloc(sizeof(int));- 次に、以下のプログラムの実行結果はどうなるでしょうか?
#include <stdio.h> int main(void) { int data, *ptr1, *ptr2; data = 10; ptr2 = (int *)malloc(sizeof(int)); *ptr2 = data; printf ("==%d==\n", *ptr2); ptr1 = &data; *ptr1 = 20; printf ("==%d==\n", data); }結果は、 ==10== ==20==となります。 ptr1 と &data の指すアドレスは同一であり、そのメモリ領域に 20 の値を代入した結果、data によって参照される値は 20 となります。