ポインタと普通の変数との違いは 「何を格納するか。」です。
とはいえ、値を格納するという意味では同じです。あまり複雑に考える必要はありません。
- 普通の変数:プログラマが操作出来る、任意の数を格納・保持する。
- ポインタ:メモリアドレスといった、一般的に直接指定できない値を格納・保持する。
両者を仲介する記号が、&と * です。特に * は 3種類の意味をもちます。
-
&:変数(オブジェクトも可)アドレスを参照(GET)する。
-
*(1):Declare 変数を定義するときに、ポインタだと明示する。
-
*(2):Set 右側に=がある時は、その値を代入する。
-
*(3):Get 式中に出てきた場合、そのポインタが示す先の値を参照する。
使い方:
【*(1)】ポインタが定義出来ます。ここではついでに普通の変数も定義します。
int i = 0 , *pt; // ptがポインタ
【&】ポインタと普通の変数を関連付けます。
pt = &i; // pt変数の値は、i変数のアドレス。
【*(2)】ポインタに対して、+1してみます。
*pt += 1; この場合、pt の参照先の変数、つまり i の値が 1 追加されます。
ここで、pt+=1 とすると、pt変数自体が+1されます。これはつまり、ポインタが参照するメモリアドレスの変数値が一個先に進むことを指しています。
【*(3)】ポインタの値を参照します。
printf( "%d" , *pt );
1が表示されますが、これはptの値が増えたのではなく、
(2) の操作によって ptの示す変数、つまりiが1増えたことを意味します。
ですので *pt == i の関係にあります。