第9回
ポインタ、そしてchar *
98/11/06 IE4.xに対応させた
98/04/29メールアドレス訂正
今回は、前回、後回しにしたポインタについて説明することにしましょう。
ええと、どこから入ろうかなぁ・・・。とりあえず、ポインタの宣言から入ることにしましょう。以下は、int型のポインタの宣言部分です。
int *a;
貴方はこれを、以下のように考えていませんか?
int型のポインタ*aを宣言した。
そう考えている方、残念ながら、それはバスレです。int型のポインタはあくまでaです。
どうもピンとこない方は、さっきの宣言部分を、以下のように解釈してみて下さい。
int *a;
aをint *として宣言する(int型のポインタはint *)。
または、
int *a;
*aは整数(int)である。
本講座で何度か登場したものの、一切説明しなかったことの一つに、以下のようなものがあります。aがint型のポインタで、bがint型変数だとします。
a=&b;
変数の前に単項演算子&が付いている場合、例えば上記における&bが示すものは、int型変数bの値ではなくて、それが実際に記録されているアドレス(といってもピンとこない方はこちらへ)です。つまり上記は、int型変数bの値が記録されているアドレスを、int型のポインタ(int *)のbに代入(普通は「指し示す」というコトバを使います)する処理ということになります。
ただし、ポインタaに配列(以下の場合、配列b)のアドレスを保持させる場合、
a=&b[0];
とする代わりに、
a=b;
とすることができます。つまり、配列名そのもの(この場合、b)は、その配列の先頭アドレスを示すのです。
ここまでくれば、なぜ文字列型がchar *であるのか、理解するのは容易い(?)と思います。まず、char型の配列bで考えてみましょう。先程の例でいうと、その配列の先頭アドレスを指し示すものは、&b[0]または配列名のbということになります。
それじゃ今度は、アドレスでは無くてその中身、つまり文字列はどうでしょう。まず1つは、当たり前ですがb[0]からb[ヌルのあるトコまで]です(文字列がchar型の配列であるということ)。もう1つは、配列名のbの中身を示す*bとなります。このことによって、配列名(char)によって指し示めされるアドレスの中身(文字列)は、char *といえます。つまり、文字列はchar型の配列であるのと同時に、char *であるということになる訳です。
最後に、ポインタと配列の関係について、以下の2つのことを覚えておくことにしましょう。aがポインタ、bが配列です。
a+iは、&b[i]と同じ。
*(a+i)は、b[i]と同じ。
つづく。
[メニュー][第8回][第10回]
いーざ
email:CQP00202@nifty.ne.jp