いきなりですが問題です.
Cのプログラムで,次の文は,どんな処理をするでしょうか.
*p *= 2;
先週の授業で出題しました(変数名や問題文は異なりますが).出席票に署名してもらう間に,答案を見せてもらったところ,
- 「pのアドレスを2倍する」
というのが少なからずありました.これに対しては,
「pのアドレスが,例えば100番地だったら,それを2倍するってことは,200番地になってしまうなあ.もちろんそんな演算(p *= 2;)は,Cの規格としてできないし,そんなことをする意味もない.『pの指し示す』という言葉を使って,書き直してごらん」
と指示します*1.
とはいえ「指し示す」を使ったとしても,
- 「pの指し示すアドレスを2倍する」
とするのでは説明は失敗で,上と同様に助言をしました.
次によく見かけたのは,
- 「pの指し示す値を2倍する」
です.これを正解にしてもいいようなものだけど,心を鬼にして,笑顔で
「『2倍』して,それでおしまいですか? うーん,もしそうだと,コードは『*p * 2;』と同じってことかな.2倍したのはいいけれど,値を捨ててしまうわけです.『*p * 2;』ではないことが分かるよう,ほんの少しだけ変えましょう」
といった指示をします.
そうしてチェックしアドバイスをしていく中で,
- 「pの指し示す値を2倍にする」
というのを見つければ,「これでOK,おつかれさん」です.
文法要素としてはポインタですが,これは関数の中での出題です.ポインタ渡しで,実引数のアドレスを格納すれば,「*p *= 2;」ほかの処理によって,関数の中にスコープを持たない変数の値も,変更できますよ,有効範囲と生存期間の区別を再確認してね,という出題意図があります.
*1:途中に「(p *= 2;)」と書いていまして,これは,「pのアドレス」が「ポインタ変数pが保持する値」という意味だというのを仮定していますが,かわりに「ポインタ変数pの格納されているアドレス」という意味で,答案にしていたとしても,「(p *= 2;)」は取り除いて,同じ指示をすることになります.