わさっきhb

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

ポインタとは

ポインタはメモリアドレスです.ただし,ポインタは「そのアドレスにどんな型のデータが格納されているか」という情報を持つ点が,単なるアドレスと異なります.
(例解UNIXプログラミング教室, p.27)

きわめて明快な説明です.感動しました.明日の授業でポインタの説明をするのですが,急きょ,資料に取り入れました.
ただ,直後の

ポインタ操作の基本は,アドレス演算(&),ポインタ変数の宣言(*),間接演算(*)の3つです.
(同上)

について,「ポインタ変数の宣言(*)」は,他の二つと別に説明するほうが,分かりやすいのではないかと感じます.
よくあるポインタの間違い(pp.29-31)も興味深いです.

ポインタの間違い(1): 未初期化ポインタ変数の間接演算
ポインタの間違い(2): 未初期化ポインタ変数を引数に渡す
ポインタの間違い(3): 局所変数へのポインタを返り値にする

について,いずれもその通りで*1,講義で力説emphasizeし,演習で見かけたらその都度指導しています.ですが,もう一つ,初学者によく見られる間違いがあります.

  • int *p;と書いたとき,変数は「*p」

正しい理解は

  • int *p;と書いたとき,変数は「p」であり,特にポインタ変数と呼ばれる
  • pに適切なアドレスを割り当てた上で,「*p」は,pの指し示す先を変数であるかのようにして,参照したり値を変えたりできる

*1:細かいことを言うと,ポインタの間違い(3)について,「局所変数」は「自動変数」としたいところです.同書p.32の解答2.3で,staticをつけて静的な局所変数にしている例も見られるのですが.