ポインタとは


   ポインタは、初心者にとって最大の難関ですが、C言語を代表する機能です。ここでは、「たとえ話」を使ってポインタのイメージをつかみましょう。
    あなたは、今月の何日かにbさんと会う約束をしていましたが、それが何日だったか忘れてしまいました。それで、あなたは何日だったかを確認するためにbさんの家に行くことにしましたが、あいにくあなたはbさんの家の住所を知りません。そこで、共通の友人であるaさんbさんの住所を知っているので、あなたはaさんの家に行ってbさんの住所を教えてもらい、それからbさんの家に行くことにしました。   話をまとめると、あなたがbさんと約束した日を確認するためには、次の手順が必要です。

1.8888番地のaさんの家に行きます。
2.bさんの住所を教えてもらいます。
3.bさんの住所が9999番地だと分かった。
4.9999番地に行きます。
5.bさんに会い、約束の日が5日だったと分かる。

これらの関係を対応表にまとめると次のようになります

名前 アドレス(住所) 入手情報
aさん 8888番地 9999番地(aさんの住所)
bさん 9999番地 5日(知りたかった情報)

あなたがbさんとの約束の日がいつかを聞き出すには、aさんからbさんの住所(アドレス)を教えてもらう必要がありました。つまり、ここではaさんがbさんの住所を指し示している(ポイントしている)わけです。

ここで話をC言語に戻すと、変数a、bがありaがbのアドレスを指し示しているときaをbのポインタにすることができます。つまり、「ポインタとは変数の格納場所(アドレス)を指し示す変数のことです。ここのたとえ話で言うと、「bさんの住所(アドレス)を指し示す人であるaさん」がポインタの役割を果たします。このポインタを使うと、間接的にほかの変数を操作することが可能になります。ここでもう一度たとえばなしの関係を表にまとめると次のようになります。

名前 アドレス 内容
8888 bのアドレス
9999 bのアドレスの内容

これをC言語の表現方法で表にまとめると次のようになります。

変数名 アドレス 内容
8888 &b
9999 *(&b) もしくは *a

   ここで「&」と「*」という演算子が出てきました。変数の前にアドレス演算子「」をつけるとその変数のアドレスを取り出すことが出来ます。bは変数なので &bで「変数bのアドレス」を意味します。アドレスを指す変数の前に間接演算子「」を付けるとそのアドレスに格納されている内容を取り出せます。&bは変数bのアドレスを意味するので「*(&b)」で変数bのアドレスに格納されている内容を意味します。
   上の表の関係をC言語の代入式を用いて表現すると
                 
                  a=&b           (変数a=bのアドレス)
                  b=*(&b)     (変数b=bのアドレスの内容)

となります。一行目の式を二行目の式に代入すると

                 b=*a

となります。この式より変数bとポインタ変数を用いた*aが同値だということがわかりました。つまり、*aを変数bの分身として扱うことが出来るのです。ここから先では、今まで「b=1」と表現していたものを「*a=1」と表現できます。この特性は非常に便利で、これから先、大いに役に立ちます。詳しくは、これから順を追って説明していきます。ここでは、ポインタとは他の変数を指し示す変数で、ポインタ表現を使うとそれが指し示す変数の分身として自在に操作することができる、と理解しておいて下さい。


  


「基礎講座もくじへ」

「Q&Aもくじへ」

「つぎへ」