ポインタ

この授業のはじめのほうで「コンピュータの仕組み」について 説明した時に, メモリという記憶装置があってそれには番地がついている, という話をしたことをおぼえているだろうか. ポインタというのはその番地(address; アドレス)をデータとして扱うための 型である.

ポインタの説明には

の二つ側面がある. この教科書では, P.282 - P.292 が前者を, P.293 - P.301 が後者を扱っている.

この教科書で紹介しているポインタの使い道は, 以下の三つ:

  1. 関数の引数として (p.293-p.296)
    関数の引数に普通の変数をそのまま書くと, その変数の値が関数に渡されるだけで, 関数内でいくらその値を変更してももともとの変数の値は変わらない. 場合によってはこれは不便で, 「こちら側の変数の値を変えてもらいたい」関数 - たとえば二つの変数の値を交換する関数 - は記述できない. そのためにポインタを使って, 「変数の番地」を関数に伝えることで 関数内でその番地を使ってこちら側の変数の値を変更できるようになる.

  2. 配列の要素の参照 (p.297-299)
    ポインタは ++ や -- で増減ができるから, 配列の要素を順に見ていく時 などに利用できる. しかし, これは普通に「a[i]」などと書いても同じことができるわけで, 昔のプログラミングでは高速化のためにポインタを使った側面があったが, 今日では使う必要はないだろう. ただ, 他人の書いたプログラムを読む時にはこういう書き方も多いので, 慣れておく必要はある.

  3. 構造体を指すポインタ (p.300-p.301)
    これはポインタの使いみちとしては本筋である. 構造体は一般には大きな(メモリをたくさん占有する)データであって, それをむやみにコピーするのはメモリも時間も必要とする. たとえば関数に構造体を渡すとき, 引数として普通に構造体の変数を書くと, そのコピーが作られて 関数に渡る(これは, 整数型の変数と同じである). ところが, 構造体のポインタを引数として渡すようにすると, 本体のコピーは作らなくてすんで, 場合によっては高速化に寄与する. また, コピーではなく本物が関数に渡るので, 関数内で構造体の一部を変更することもできる(このへんは 1. で説明したことと同じ).

    さらに進んだプログラミングとしては, 構造体の中に別の構造体へのポインタを 持たせて, 複数の構造体をポインタで順次つなぐこともできる. しかし, これは「データ構造」という名の, もっと進んだ話で, この授業の範囲ではない.


[page 3] prev index next