先の節で見たように、変数のアドレスを知ることが出来たら当然そのアドレスを保存 しておきたいような時があるだろう。勿論、アドレスは負でない整数なので、単純に 整数変数に取って置くことも考えられるが、これだけではいささか不便である。 何故ならば、そのアドレスが示しているデータはどんなデータなのであろうか? 整数なのか、実数なのか、はたまた配列や構造体のような複雑なデータ型を指して いるのだろうか?その違いが分からなければ、甚だ不便であろう。そこで C 言語 では、単に変数のアドレスを覚えて置くだけに留まらないものとして、ポインタ変数 というものを用意している(ここでポインタはアドレスと同じだと思って良い)。
ポインタ変数は、2つの情報を保持している。1つはどんなデータ型を指している かという事であり、2つめはそのデータのアドレスである。一番目のデータ型に 関する情報は一度ポインタ変数を宣言すると以後変更することは出来ない。一方、 アドレスそのものはポインタ変数に代入されるものなので変更可能である。
重要
|
下の図では、ポインタ変数 p
に 1232 という値があり、アドレス 1232 には
4 という値が格納されている。このようにアドレスが格納されている場合、アドレス
1232 をポイントしているという、又は、アドレス 1232 は変数 a
なので
ポインタ変数 p
は変数 a
をポイントしているという。
以下にポインタ変数の宣言方法を示す。
[型] * 変数名; [型] * 変数名, * 変数名,...; |
2 番目の書式は、複数の同じ型へのポインタを宣言する方法だが、全ての変数名の
前に *
をつけるのを忘れてはならない。
例 int *p; int *p1, *p2, *p3; float *fp; char *cp; |
最初の例は整数型のポインタ変数 p を、2番目は整数型のポインタ変数 p1,p2,p3 を、 3番目は実数型のポインタ変数 fp を、最後の例は文字型のポインタ変数 cp をそれぞれ宣言している。
例1 int a; int *p; a = 3; p = &a; printf("address of a is %u\n", p); |
この例では、整数型変数 a のアドレスをアドレス演算子 &
を用いて p に
代入している。