10.ポインタ

10-2. ポインタの宣言

◇ポインタの宣言

それでは早速ポインタを宣言しましょう。
int型変数を操作するポインタ変数pの宣言。

int *p;

これでポインタpが宣言されました。
実はC言語の宣言の書式はあまり好きではないのです。
何故かって?それは後々混同しやすい事が起きるからです。

ちなみにC++では

int* p;

と宣言できます。これなら意味の解釈も楽になります。
まず誤解してもらいたくない事柄
1.変数名に*をつけたものがポインタではない。
2.ポインタに代入するのは変数の値ではない。アドレスである。
3.宣言時の型は操作する変数の型でありポインタの型ではない
因みにポインタの型はアドレスを代入することからintと同じになります。

ということで宣言式を解釈すると…

int        *           p
操作する変数の型 ポインタとしての宣言 ポインタ名になります。

次にポインタに操作する変数のアドレスを設定します。

p = (操作する変数のアドレス);

これでOKです。上の1で誤解している人には p である意味自体わからないと思います。この p がポインタ名なのです。

次に問題なのは変数のアドレスをどうやって表すのかです。
変数の頭に & をつけるとその変数のアドレスを表します。
因みにこの & はビット演算子の & とは別物になりアドレス演算子と呼びます。
たとえば操作する変数を var とすると。

p = &var;

のようにします。
最後に変数の遠隔操作。これはどうやるのかというとポインタに間接参照演算子をつけて操作します。その演算子が * です。紛らわしいでしょう。
そう宣言のときの * とも掛け算の * とも違うのです。

p = &var;
*p = 3;

上の式はポインタ p に変数 var を操作するように設定したので、*p は間接的に var を操作することになります。つまり上の式ではポインタを使って var に3を代入しているのです。

ここまでのおさらい。

int *p; /* int型変数を操作するポインタ p の宣言 */
int var; /* int型変数 var の宣言 */

p = &var; /* var のアドレスをポインタ p に設定 */
*p = 3; /* p による遠隔操作ここでは var に3を代入 */

当たり前なのですがポインタが操作する変数は変えることができます。

int *p; /* int型変数を操作するポインタ p の宣言 */
int var1,var2; /* int型変数 var1 var2 の宣言 */

p = &var1; /* var1 のアドレスをポインタ p に設定 */
*p = 3; /* p による遠隔操作 var1 に3を代入 */

p = &var2; /* こんどは操作する変数を var2 に変更 */
*p = 7; /* p による遠隔操作 var2 に7を代入 */