ちょっと難しいので概念だけつかみたい人は
ちょっと後のほうを見るといいでしょう。
さて、ポインタというのは、pointer、つまり、指すもの、という意味です。
ポインタの使用はコードが複雑になってしまうことが多いため、あまり好ましくないといわれています。
ですが、正しく理解して用法と用量を守れば、非常に強力な武器になりえます。
また、C言語やWindowsAPIの関連で使わざるをえなくなる場合もあります。
というわけで、敢えて、ここで紹介します。
まず、ポインタを語るにはメモリを語らなければなりません。
メモリというのは、ハードディスクドライブのように情報を記録しておくためのものではなく、一時的に情報を記憶するためのものです。
ですから、パソコンの電源を切ると、メモリは消滅します。
メモリというのは場所のようなもので、データ置場のような役割を果たします。
データを処理するには、メモリに一度データを置いておき、そこからデータを取り出して処理を施し、またデータを置きなおす、ということが行われています。
前回まで使ってきた変数ですが、これは宣言されることによって必要なメモリを確保します。
メモリが足りません、とか、そういうような言葉はここからきています。 必要なメモリが足りなくて確保できなかった、というわけです。
メモリが足りないとハードディスクドライブ(HDD)などからメモリをがんばって持ってこようとします(仮想メモリと言います)。 しかし、普通のメモリとHDDの仮想メモリでは、どう考えても仮想メモリの速度がべらぼうに遅いのです。 だから、快適な動作をしようと思ったらメモリを増築するわけなのです。 …話がそれました。
前回までのプログラムでは変数を用いてきましたが、この変数にはすべて名前が付いていましたね。
int data;
この場合ならば「data」が名前です。 変数を使うということは、このように変数を宣言することでメモリが割り当てられ(intなら4バイトのメモリが割り当てられます)、この変数名を使用することで、そのメモリ上のデータにアクセスすることができました。
ところが、今回やるポインタというものを使うと、変数名でなくてもメモリ上のデータにアクセスすることができるようになります。
ところで、メモリにはアドレスというものがあります。
メモリ上の領域のある場所を指し示す場合、このアドレスというものが使われます。
データは、メモリのアドレスと使用する大きさがわかれば使用することができます。
この、特にメモリのアドレス、というやつがポインタです。
変数名を使うと、このあたりのことを自動でやってくれるため、気にしなくてもよかったわけです。
というわけで、変数名がわからなくてもアドレスさえ分かれば、ポインタの示すデータの型からサイズが推測できるため、データにアクセスできるというわけです。
さて、云々と長ったらしく説明してきましたが、とどのつまり、ポインタというものは、「データを指し示すもの」です。
変数が箱で、箱の中身がデータだとしたら、ポインタというのは、箱のある場所のことです。
ちょっと図解してみましょう。
まず、広い空間があります。 メモリです。
次に、変数を宣言してみましょう。 この広い空間に、箱を置く、ということですね。 ここでは2バイトのデータを宣言したとしましょう。
コードで言うと
short data;
となります。 2バイトのデータ型はshortという型なので。
これを図にすると…
これで、dataという変数が使えるようになったわけです。 dataという変数名を使えば、アドレスやサイズを意識することなく中身のデータにアクセスできます。
さて、このデータの入っている変数という箱ですが、この箱のある場所がアドレスに対応します。 図で言うと24という数値がそれです。 そのアドレスを記録するものがポインタというわけです。
この置かれた箱を、ポインタで表すとこんな感じです。
アドレス24にサイズが2バイトの箱がありますよ、ってことですね。
んで、この、アドレス24という情報が、ポインタってことです。
難しいように感じるかと思いますが、普段私たちの生活の中でも似たようなことを自然に行っています。
たとえば、URLなんかがそうです。
誰か人に見せたいホームページがあったとします。
どうやって見せますか?
ここでは2つの方法を紹介します。
1つ目はエクスプローラで「ファイル>名前を付けて保存」によって保存されたデータをメッセンジャーなどのファイル送信を使って渡す方法。
2つ目はURLを教えること。
前者が今までの変数で、後者がポインタと同じような操作です。
そのままのデータをやり取りするか、データを指し示すものでやり取りするか、そういった違いが、変数とポインタなのです。