わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

ポインタをどう教えるか

次の金曜日に,ポインタを教えます.土曜日に,きょうかん酒場を実施するかの連絡を待ちながら,授業準備をしていました.
昨年度までで,教えていた要所をまとめると…

  • 「オブジェクト」と「ポインタ」と「配列変数」とを,異なる(色や輪郭の)箱で表現して見せる.
  • 配列は固定的,ポインタは身軽.これも1枚の図で見せる.
  • ポインタ変数pに対して「p++;」とするとどうなるか,図で示し,時間をとって解説する.
  • 文字列の配列について,argvを用いて説明する.これにより,ポインタのポインタだけでなく,コマンドライン引数という新しい「入力のとり方」を知ってもらう.
  • 「多次元配列」と「ポインタのポインタ」は違うことを,図とコード例で示す.

それでも理解度*1が高いとは思えません.そこで見直したところ,

  • 「ポインタ変数」と「ポインタ値」を区別すること
  • 「参照」という用語を注意して使用すること

にあるのではないかと考えました.
『ポインタ変数に格納(代入)できるのは,同じポインタ型の,ポインタ値です.代入でないときのポインタ変数は,そのポインタ変数が保持しているポインタ値となります.』
上の文から「ポインタ」をすべて削除しても,意味が通ります*2.言い換えると,ポインタを考慮しない世界で当たり前のことが,ポインタでも成り立つということです.これを当たり前のことと軽視することなく,きちんと言うことにしましょう.
「参照」については,単項演算子の*を使って「参照する」と言えますし,変数の値が今何であるかを見ることも「参照する」と言えます.しかしこれら2種類の参照は,異なる意味合いを持ちます.そこで,表現を変えてきちんと分けようということです.
前者は「指し示す」を使うようにして,後者は,「参照・代入ともに可」とか書きたいので,そのままにするのはどうでしょうか.この方針で,授業スライドを書き換えてみました.

*1:それぞれの人がどれだけ深く理解してくれるか,ではなく,全体の何%が大まかにでいいので理解してくれるか.

*2:ただし,int型変数にchar型の値を代入できますが,intのポインタ変数にcharのポインタ値を代入することは,キャストなしには,できません.