本物のC

C の基本:ポインタ


ポインタ

関数や変数は仮想アドレス空間上の領域なので、当然それぞれにアドレスがあります。何らかのアドレスを記憶する変数はポインタ(pointer)と呼ばれます。

例えば下の様に変数x及びptrがあったとして(アドレスは適当です)、

アドレス
: :
0x0028FF10 ? ptr
0x0028FF11 ?
0x0028FF12 ?
0x0028FF13 ?
: :
0x0028FF20 ? x
0x0028FF21 ?
: :

ptrxのアドレスを記憶すれば、ptrからアドレスを辿る事で間接的にxへアクセスする事ができます。

アドレス
: :
0x0028FF10 0x20 ptr
0x0028FF11 0xFF
0x0028FF12 0x28
0x0028FF13 0x00
: :
0x0028FF20 ? x
0x0028FF21 ?
: :

(リトルエンディアンの場合を想定しています。)

xshort型であるとすると、ptrshortへのポインタ型(pointer type)になっています。これはshort *と表記されます。

*は左矢印 ← みたいなものだと思っておけばよいでしょう。C の記号は割と適当に選ばれたものが多く、*である事に深い意味はありません。

アドレス操作

関数や変数に割り当てられた領域のアドレスは、&により得られます。

例えば上に書いた状況では、&xは 0x0028FF20 に、&ptrは 0x0028FF10 になります。

逆にアドレスの示している領域へアクセスするには*を使います。

ptrxのアドレスを記憶していれば、*ptrxと同じ領域を指す事になります。

short x;
short *ptr;
ptr = &x;
*ptr = 1; /* x の値は 1 になる */