教育実習(みたいなもの)でつかった資料が見つかったのでメモ。いつか再編したい。
メモリ
コンピュータがデータを扱う時、その殆どは一旦メモリへ保存される。
関数も変数もなにもかも、基本的にはまずメモリへ置かれると考えれば概ね問題ない。
メモリはコンピュータにとっての作業机のようなものだ。
例えば
int i = 0;
という一文は、実はメモリという名の作業机に「i」という場所を用意させ、その中身に「0」を入れさせている。
アドレス
人間と違って、コンピュータは融通が利かない。
先程メモリのことを作業机と例えた。
人間が机へ物を置く時、その位置を細かく考えることはないだろう。しかしコンピュータはそうはいかない。どこに置くか細かく指定しなければならない。
"コンピュータの作業机"メモリには、番号が振られている。
将棋やチェスの対局をみたことがあるなら話は早いだろう。「先手3四歩」とか、「ナイトをHの3へ!」とか、ああいうのと基本は同じだ。
プログラミング言語における「変数」というのは、「3四」とか「Hの3」とかいう代わりに、そのマス目に名前をつけて、どのように扱うかを記録したものだということができる。
この「3四」だの「Hの3」だのというものをアドレスと呼ぶ。
先の
作業机に「i」という場所を用意
という指示は、実際には「適当なアドレスに場所を確保させて、その場所に "i" という名前をつけておく」ということを意味する。
ポインタ
これまでで変数 i を用意した。
通常であれば、この変数 i を経由してデータを操作していればよい。
しかし時として、変数 i を経由したくないとか、変数 i の隣のデータを触りたい、という需要が発生する……ことがある。
そんな時に使うのがポインタである。
ポインタは「あるメモリ・アドレス」を「変数の値」として持つ、ちょっと特殊な変数である。
先の変数 i が実際に参照していたのをメモリ・アドレス A0 であると仮定しよう。
変数 i のポインタを取得すると、そこには A0 が記録されている。
ポインタには2つの特性がある。
- ポインタのもつアドレスは足し引きできる。
たとえばアドレス A0 に +1 して、A1 とすることができる。 - ポインタのもつアドレスを辿り、そのアドレスに格納されている情報へアクセスすることができる。
たとえば変数 i のポインタ ip を使用すると、変数 i のもつデータへアクセスできる。
(配列が 0 から始まるのはこれが理由で、例えば配列 a の一番目が 0 なのは、実は配列 a のポインタ ap に +0 したものにアクセスしなさい、ということから来ている)