next up previous
Next: 循環リスト Up: ポインタと循環リスト Previous: ポインタを利用したアドレスの記憶

ポインタの利用

ポインタはアドレスを表すのであるから,ポインタに型があることは本来はおか しい気がする.しかしポインタをどのように利用するのかを考えると,ポインタ に型があった方が便利なことが理解できるであろう.

例えばptrというポインタが指しているメモリのデータを取得することを 考えよう.単純に考えると,ポインタの指しているアドレスから1byteのデータ を取ってきて,その次のアドレスからも1byteのデータを取ってきて,……とい うことを繰り返して,それらを組み合わせてあげるという方法が考えられる.

しかし実際にはint型といってもシステムによって大きさが異なることがあり, さまざまなシステムで動くプログラムを作ろうとすると,まずint型の大きさを 調べなければならない,など大変な手間になってしまう.そこで,ポインタがど の型のデータを指しているか,ということはシステムの側で判断して,ポインタ の指している先のデータを取得する,ということができるような仕組みが用意さ れている.これが*演算子である.ポインタに対して,*演算子を用 いると,ポインタが指している先のデータ,を意味し,その時の型はポインタ宣 言時の型だとして扱われる.すなわち,int *ptr;と宣言したときは, *ptrは,int型として扱われる.

ポインタ変数に*をつけた場合,ポインタが指しているデータを意味する のであるから,ここに値の代入を行うことも可能である.この場合,ポインタが 指しているメモリ領域に値が書き込まれる.

(3)
次のプログラムを入力して,*演算子がどのような演算をして いるのか確認しなさい.また,そこへの代入がどのような処理をしているのか考 えなさい.

figure87

このプログラムの9行目で,ポインタ型の変数にアドレスを代入している.この 行まではポインタ型の変数にどのような値が入っているかは保証されていない. このため,9行目よりも前にポインタ変数の指している先のデータを参照すると, 動作が保証されないため,注意が必要であるgif

なお,C言語では,値が0のポインタ変数は,いかなるデータも指さない(逆に言 えば,いかなる変数も0x00000000というアドレスには格納されない)ということ が保証されている.この値が0のポインタ変数をヌル(NULL)ポインタと呼び,明 示的に何も指していない状態を表すときに利用する.一般にはNULLで定義 されているため,ptr = NULL;という代入を行うと,ptr変数は何 も指していない,という状態となる.




2000年09月06日 (水) 18時26分54秒 JST