リスト2の普通の変数v1, v2, v3は、整数を格納する変数です。コンパイラー が確保した領域に整数を格納します。コンピューターのメモリには、すべて、アドレス (番地)がついています。各アドレスには、1バイト(=8ビット)のデータが対応しています。 このアドレスに従い、メモリー内のデータや命令を参照しています。プルグラムの実行時 は、v1等の変数が呼ばれると、それに対応したアドレスが呼ばれ、データの参照をします。
これら普通の変数のアドレスを参照したいときは、&v1のように、変数の前に&をつけま す。これで、その変数の先頭アドレスを直接見ることが出来ます。例えば、int型の変数 であれば、4バイト1のメモリー領域が必要なので、連続した4つのアドレスのメモリー領 域を使用します。その先頭アドレスを&v1のようにして参照します。
定義 | int v1; |
データの参照 | v1 |
アドレスの参照 | &v1 |
一方、リスト2のポインターp1,p2,p3はアドレスを表 す変数です。通常の変数とは異なり、コンパイラーにより確保された領域にアドレスを格 納します。アドレス、即ち、値の場所を示すものだから、ポインターといいます。ポイン ターもアドレスというデータを格納するため、連続したメモリー領域が必要です。秋田高 専のパソコンは32ビットアドレッシングのため、4バイトのメモリー領域が必要です。
プログラム内で*p1のように呼ばれると、p1が示しているアドレスの値を参照します。p1 は先頭アドレスを示しているので、型に応じたバイト数を呼び出すことになります。その ため、ポインターにも、型が必要になります。
プログラム内でp1と呼ぶと、そのポインターが示しているアドレスを参照します。また、 &p1と呼び出すと、ポインターの先頭アドレスを参照します。
定義 | int *p1; |
ポインターが示しているデータの参照 | *p1 |
ポインターが示してるアドレスの参照 | p1 |
ポインターのアドレスの参照 | &p1 |
ポインターに関係する演算子を下表に示します。
演算子 | 機能 |
* | ポインターが指しているアドレスの内容を取り出す |
& | 変数が格納されているアドレスを取り出す |
例えば、ポインターの勉強のために、リスト2を実行しましょう。
----- address hexadecimal ------- &v1=bffff6b4 &v2=bffff6b0 &v3=bffff6ac &p1=bffff6a8 &p2=bffff6a4 &p3=bffff6a0 ----- value decimal ------- v1=-1 v2=2 v3=3 *p1=-1 *p2=2 *p3=3 ----- value hexadecimal ------- v1=ffffffff v2=2 v3=3 *p1=ffffffff *p2=2 *p3=3 ----- pointer hexadecimal ------- p1=bffff6b4 p2=bffff6b0 p3=bffff6ac --------------------------------- address data bffff6a0 ac bffff6a1 f6 bffff6a2 ff bffff6a3 bf bffff6a4 b0 bffff6a5 f6 bffff6a6 ff bffff6a7 bf bffff6a8 b4 bffff6a9 f6 bffff6aa ff bffff6ab bf bffff6ac 03 bffff6ad 00 bffff6ae 00 bffff6af 00 bffff6b0 02 bffff6b1 00 bffff6b2 00 bffff6b3 00 bffff6b4 ff bffff6b5 ff bffff6b6 ff bffff6b7 ff