LoginSignup
1
0

More than 5 years have passed since last update.

ポインタ

Posted at

教育実習(みたいなもの)でつかった資料が見つかったのでメモ。いつか再編したい。

メモリ

コンピュータがデータを扱う時、その殆どは一旦メモリへ保存される。
関数も変数もなにもかも、基本的にはまずメモリへ置かれると考えれば概ね問題ない。

メモリはコンピュータにとっての作業机のようなものだ。
例えば

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つの特性がある。

  1. ポインタのもつアドレスは足し引きできる。
    たとえばアドレス A0 に +1 して、A1 とすることができる。
  2. ポインタのもつアドレスを辿り、そのアドレスに格納されている情報へアクセスすることができる。
    たとえば変数 i のポインタ ip を使用すると、変数 i のもつデータへアクセスできる。

(配列が 0 から始まるのはこれが理由で、例えば配列 a の一番目が 0 なのは、実は配列 a のポインタ ap に +0 したものにアクセスしなさい、ということから来ている)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0