C の基本:ポインタ
ポインタ
関数や変数は仮想アドレス空間上の領域なので、当然それぞれにアドレスがあります。何らかのアドレスを記憶する変数はポインタ(pointer)と呼ばれます。
例えば下の様に変数x及びptrがあったとして(アドレスは適当です)、
アドレス | 値 | ||
---|---|---|---|
: | : | ||
0x0028FF10 | ? | ptr | |
0x0028FF11 | ? | ||
0x0028FF12 | ? | ||
0x0028FF13 | ? | ||
: | : | ||
0x0028FF20 | ? | x | |
0x0028FF21 | ? | ||
: | : |
ptrにxのアドレスを記憶すれば、ptrからアドレスを辿る事で間接的にxへアクセスする事ができます。
アドレス | 値 | ||
---|---|---|---|
: | : | ||
0x0028FF10 | 0x20 | ptr | |
0x0028FF11 | 0xFF | ||
0x0028FF12 | 0x28 | ||
0x0028FF13 | 0x00 | ||
: | : | ||
0x0028FF20 | ? | x | |
0x0028FF21 | ? | ||
: | : |
(リトルエンディアンの場合を想定しています。)
xがshort型であるとすると、ptrはshortへのポインタ型(pointer type)になっています。これはshort *と表記されます。
*は左矢印 ← みたいなものだと思っておけばよいでしょう。C の記号は割と適当に選ばれたものが多く、*である事に深い意味はありません。
アドレス操作
関数や変数に割り当てられた領域のアドレスは、&により得られます。
例えば上に書いた状況では、&xは 0x0028FF20 に、&ptrは 0x0028FF10 になります。
逆にアドレスの示している領域へアクセスするには*を使います。
ptrがxのアドレスを記憶していれば、*ptrはxと同じ領域を指す事になります。
short x; | |
short *ptr; | |
ptr = &x; | |
*ptr = 1; /* x の値は 1 になる */ |