わさっきhb

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

2倍する

いきなりですが問題です.

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;)」は取り除いて,同じ指示をすることになります.