トップ過去ログこのサイトについて
1292107

ポインタ

[Program] at 2004/10/01 00:48:52.
 じくうさんのページでポインタに混乱している様子が書かれていたので便乗触発されてポインタについて書いてみようとか思ったり思わなかったり。

 よく他人に対して説明するとき、「どこそこに書いておいたから見といてー」というような言い方をしたことがありませんか?ポインタとは、まさしくこのような使われ方をします。

 例によって大雑把にまとめてみました。



 ポインタ(pointer)というのは要するに指し示す(マウスカーソルだとかレーザーポインタとかあんなイメージ)ものです。これは何を指し示しているのかというと、自分自身ではない「別の場所」を指し示しています。

 プログラミングの世界であっても同じ話で、自分とは別の場所(=コンピュータの世界ではメモリのアドレス)を指し示すものがポインタです。

 ポインタはさまざまな用途に使用されますが、
  ・自分より大きなものや、たくさんの情報があるものを指すときに使う(一番最初の例のようなケース)
  ・プログラムの使いまわし(効率化)をしやすくする
などの目的で使用されることがほとんどです。(C++などのオブジェクト指向言語はもうちょっと用途が増えます)

 ポインタは使い慣れると大変便利なのですが、変に多用しすぎると、このポインタが一体どれを指しているのかが、一見してわかりにくくなってしまうことがあります。


 以上がかなり大雑把なポインタの概要になります。
 これから先はちょっとプログラミングよりの話。

 具体的にC言語の例を挙げてみると、以下のように使用します。(注:メイン部分のみ。これだけでは実際に動きません)
 この例では、nBoxという「整数型」に対して、pBoxという「整数型に対するポインタ」を用意しています。


int nBox;
int *pBox;

nBox = 4126;
pBox = &nBox;

printf("pBox = 0x%08x / nBox = %d\n", pBox, nBox);
printf("pBoxが指し示すものは %d\n", *pBox);



 空の行で区切っていますが、上段が宣言を行う部分、中段以降が実際の処理の部分です。それぞれの部分をちょっと詳しく見てみます。

 まずは上段から。今一般的に使用されているほとんどの言語において、「自分はこういった名前の、こういうものを入れる場所を使います」と、コンピュータにあらかじめお伺いを立てておく必要があります。これを宣言といい、ここではnBoxとpBoxという二つの箱を用意しています。
 両方とも入れたいものはint型(整数型)と宣言していますが、pBoxのほうは余計な記号がついています。これはpBoxを、int型に対してのポインタとして使用したいことを示します。
 ポインタを扱えるプログラミング言語では、その指し示す先のものがどういった形(整数・実数・文字 等)なのかを示さなければなりません。それが「ポインタの型」と言われるものです。

 続いて中段。nBoxに 4126 という数字(ヨイフロではなくよんせんひゃくにじゅうろく)を入れています。そしてpBoxに、「nBoxはここだよ」という情報を渡したいのですが…なんかやってますね。C言語では &記号 をつけると、その場所(=メモリのアドレス)を教えてくれるようになります。そしてそれをpBoxに入れています。

 最後に下段。ここはprintfという、画面に出力してねという命令(C言語では関数と呼びますが)を使用しています。
 一行目はnBoxとpBoxの中身をそれぞれ出力しているだけですが、二行目のpBoxにまた *記号 がついています。宣言部では「これは別のものに対するポインタ」という意味でしたが、それ以外の場所では、「これが指し示す場所」となります。ここでの *pBox は、pBoxが指す場所、つまりnBoxとなり、結果的に 4126 が表示されます。

 ピンと来る方なら、「じゃあポインタに対してポインタを作れるんじゃないの?」と思うかもしれません。もちろん、ポインタに対してポインタを作ることも、「ポインタに対して作ったポインタ」に対するポインタを作ることも可能です。…が、あまり使いすぎるとワケが分からなくなってしまうことがあるので、注意が必要です。


 このプログラム例では、nBoxもpBoxも実は大きさが変わらなかったり、場合によってはpBoxのほうが大きくなることがあるので、あまり意味が無い内容だったりするのですが、動きを見たかっただけですのでこういったものとなっています。

 では、nBoxがもっと大きいもの、たとえば構造体だったらどうでしょう。構造体というのは、大きな箱の中に色々なものが詰められたもののことを言います。

 別の人に物を渡すとき、一つずつ渡していたら時間がかかります。でも、箱や袋などに詰めて「あの箱に必要なものが入ってるから」と言えば手っ取り早くて済みます。
 コンピュータの世界でも同じことで、構造体に必要な情報を全部入れ、別の人(プログラムであったり関数であったり)に、「ここの場所に必要な情報があるから」と、その構造体に対するアドレスを渡してあげれば、手っ取り早く作業が行えます。


 かなり大雑把な説明ではありますが、ポインタについて長々と説明してみました。
 ここを見ている人は本当に少ないので、実際問題ほとんどの人にとってはまったくもってワケのわからない&役に立たない内容だと思いますが、まあそんなコンセプトのBlogですんでひとつご容赦願います^^;

コメント

コメントはありません。

コメントを登録

この記事へのトラックバック

ナビゲーションバー