int a=15;
といった感じで、その変数がどの型の変数なのか前もって宣言しなければなりません(K&R2第1章1.2参照)。おっと、ここでは、宣言と同時に値を代入して初期化していますが・・・。
つまり、aをint型の変数として宣言した上で、その値に15を代入して初期化しているという訳です。その際、心の片隅に、本当はメモリ上のどこかのアドレスを、int型変数aに割り当てると共に、そこへ15を記憶したんだと、留めておいて下さい。その理由はわかりますよね。:-)
それとプログラムの4行目、
int *b;
も、bをint型のポインタ(int *型)として宣言したということです。さっきとは違って宣言と同時に初期化を行っていません。
ちなみにint型ポインタbが初期化されるのは、int型変数aのアドレス(=&a)が指し示された7行目、
b=&a;
です。
で、ここで注意しなければならないことがあります。ポインタが初期化されていないのに、10行目、
*b=20; /* そのアドレスに記憶されている値を20にする */
のような処理を行っては絶対にいけないという事です。ちょっと話が脱線しちゃいますが、非常に重要なことなので説明します。
ポインタが初期化されていないという事は、ポインタがメモリ上のどのアドレスを指し示しているのか、まだわからない状態
といえます(大抵は0になっている可能性が高い)。つまりその状態で、上記のような処理を行ったらどうなるでしょう?
答え。メモリ上のどこかわからないところに20という値が記憶される、つまりそこにあるデータが破壊されるということになります。運が悪ければコンピュータが暴走することだって有り得ます。ポインタが危険だと言われる理由はそこにある訳です。
で、話は型に戻します。
本講習で使う(予定)の主なデータ型をまとめてみました。また、それに対応した変換文字も載せてみました。
データ型 意味 例 変換文字 int 整数(-32768から32767) 10000 %d long int intを超えるデカい整数 100000 %ld float 実数 3.321 %f char 文字 'a' %c char * 文字列 "いーざ" %sそれと、同じデータ型の変数(例えばint型)を2つ以上宣言したい時は、
int a,b,c;
といったように、カンマで区切ることで同時に宣言することが可能です。ただし、2つ以上のポインタを同時に宣言する際、
int* a,b;としてしまうと、bの方は単なるint型変数として宣言されてしまうので注意して下さい。
int *a,*b;として下さい。
つづく。