第6回

ちょっと後回しにしてしまった型

98/11/06 IE4.xに対応させた
98/04/29メールアドレス訂正

今回は、型について学ぶことにしましょう。
本講習の第3回(printf変換のところ)をきっちりと取り組んだ方であれば、型が何であるのか薄々気付いていることと思います。まずは第3回でお世話になった、K&R2第7章7.2の、基本的なPrintf変換の表(7-1)のページを再び開いてみて下さい。
第3回では、まだ早いということで触れずに飛ばしたところがありました。そう、引数の型のところです。目を通してみると、intとか、char *double等といったものが記述されています。つまり、これらがという訳です。例えば変換文字d,iのところを見ると、引数の型がintとなっています。これは変換文字d,iは、引数としてint型のデータを受け取って、印字のされ方にある通り、10進数として出力(表示)するという意味です。また、文字列の変換文字sの引数の型を見てみると、本講習第5回の最後の方にちょっとだけ紹介したchar *が載っています。まずは、確認だけしておいて下さい。
この表には、データ型として、intdouble等が記されている訳ですが、変数でそれらの型のデータを取り扱う場合、前回のプログラムの3行目のように、

   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型変数として宣言されてしまうので注意して下さい。
1回の宣言で2つ以上のポインタを宣言する場合は、

int *a,*b;
として下さい。

つづく。


[メニュー][第5回][第7回]

いーざ
email:CQP00202@nifty.ne.jp