わさっきhb

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

[大学教育][情報教育] 値渡しと参照渡しの違い(2)

(1)の続きです.

値渡しの効果

先生「うん,今までのは,値渡しや参照渡しの『操作』としては,入口でしかないんですよ」
学生「入口,ですか…」
「中身と,それから出口というか関数処理を終えるとどうなるかについても,言わないと,違いが分かったことにはならないんです」
「中身,ですか…」
「中身といっても,難しく考えなくていいですよ.具体的な関数を検討しているわけではないですから」
「…」
「では質問しましょう.値渡しの場合,関数の処理の中で,実引数と仮引数はどうなりますか?」
「えっと…仮引数は,関数のローカル変数ですけど」
「あれ? 『ローカル変数』は,今までの議論の中で出てこなかったね?」
「ダメですか?」
「まあ,悪くないか.で,ローカル変数だと,どうなるんでしょう?」
「関数を終えると,なくなります」
「うん,まあ,『関数の処理を終えると』のほうがいいね」
「あ,はい」
「処理を終えるまでは,その仮引数,どうですか?」
「中身を自由に変えられます」
「うん,でもこういうときは,『中身』ではなく『値』のほうがいいかな.まあ,どっちの言葉もメモしといてね」
「はい」
「仮引数はこれでよしとして,実引数は,どうですか?」
「実引数は…値渡しですね?」
「そうです,今は」
「実引数は…関数から見ることができません」
「『見ることができない』を,別の言い方にすると?」
「実引数は,関数から,参照することができません」
「参照だけですか?」
「参照できないので,変数の値を変えることもできません」
「うん,まあこれは,実引数が,代入可能なオブジェクトであるという前提で言えるのですが,そこまで細かく考えなくてもいいでしょう.では,値渡しの効果を,関数,仮引数,実引数を使って説明してみてください」
「はいえっと…値渡しにした場合,関数からは仮引数を参照することができないため」
「そこは実引数ではないですか?」
「あっそうでした.…値渡しにした場合,関数からは実引数を参照することができない.なので,仮引数の値を変更しても,実引数の値は変わらない」

表現を磨く

先生「ほぼOKです.だけど,よりよい表現にするためのアドバイスをすると,まず『なので』はよくない」
学生「『したがって』ですか?」
「そうだね.それが1点.それと,終わりの『実引数の値は変わらない』のところ,こういうときは『実引数に影響しない』のほうがいいかな」
「これはなぜですか?」
「うーん,直前が,『仮引数の値を変えても』だったでしょ? んで『実引数は変わらない』は直接的というか,ひねりが足りないのです」
「でも,意味は通りますよね」
「まあね.聞いてもらう人,読んでもらう人によっては,『あっちを変えても,こっちは変わらない』のほうが伝わるってこともある.だけど,大学生の書く文章として,『変える』ばっかり使うのは,単純というか,稚拙に見えることがあるんです.特に書き言葉では」
「…」
「『影響しない』と『変わらない』は,ここでは同じ意味です.こうして,『変える』の表現を1個減らして,代わりに同じ意味の表現を取り入れることで,書き方にふくらみを持たせるという用法です」
「さっき,稚拙とおっしゃいましたが」
「うん?」
「『影響しない』と表現したら,稚拙の反対になるんですか?」
「稚拙の反対,とは面白い言い方だね.まさにそのとおり.より多くの語彙を利用しているのです.日本語よりも英語で文章を書くとき,気を配らないといけません.ただこれは脱線なので,そろそろ参照渡しの話に移りましょ」
「先生,その件で最後に一つだけ」
「うん,はい」
「『変わらない』を『影響しない』に置き換える,というルールなんかは,どうやって知ればいいのでしょうか?」
「ふだんから語彙を増やし,言葉に注意しながら,読み書き聞き話すことですが…あと,類語辞書って知ってますか?」
「いえ」
「英単語に対してその日本語を知るのには和英辞典,日本語に対してその英語を教えてくれるのが和英辞典」
「ええ」
「日本語でも英語でもいいけど,単語に対してその類義語を教えてくれるのが,類語辞典です.シソーラスとも言ったりします.本としての類語辞書は分厚いし,ええ値がするけど,Webで使えるのもあるので,調べてみてくださいな」
「はい」
「えらい脱線したなあ」

参照渡しの効果

先生「値渡しと対比する形で,参照渡しの効果を,説明してくれますか」
学生「はい…参照渡しにした場合,関数からは実引数を参照することができる.なので,……」
「あ,値渡しのメモから,参照渡しの説明を作ろうとした?」
「ええ,でもなんかおかしいですね」
「うーん,じゃあ一つ一つ行こう.なぜ,参照渡しだと,関数から実引数を参照できるんでしょう? C言語限定で」
C言語限定? …あ,はい,ポインタです」
「はい,では,参照渡しの場合の,関数,実引数,仮引数の関係を説明してくれますか.それができれば,効果の半分が説明できたようなもんです」
「えっと…参照渡しでは,関数の仮引数のポインタ先が実引数」
「ああ『ポインタ先』はまずいよ.そいや試験にも書いてたっけ」
「まずいですか?」
「そうだな,そこは,僕の授業の表現を使えば『指し示す先』」
「はい」
「じゃあ,もう一度関係の説明を」
「はい…参照渡しでは,関数の仮引数がポインタ変数で,その指し示す先が実引数となります」
「よし,じゃあ効果は?」
「なので,仮引数の値を変えることで,実引数に影響を…」
「及ぼす,だな」
「影響を及ぼすことができる」
「と言いたいけど,まあいったんそこまでメモしといて,んで立ち止まりましょう.その答えでは誤解を招くので,直していきます」
「あっ,はい」
「『仮引数の値を変える』とは,どういうことですか?」
「*p=1,みたいな」
「おっと,具体的な式が出て来たか.まあその式でいいや.その中で,仮引数は,どれですか?」
「*pです」
「え? 僕の,ポインタの授業,出てた?」
「たぶん今年は,欠席してました」
「うーん.仮引数はポインタ変数でなければならないので,そこはpだけのはずです.*は何だと思いますか?」
「ポインタをポインタじゃないものにするもの」
「うわ! 一言でいうと,その*は,演算子です.間接演算子*1といいます」
「…」
「*pでもって,pが指し示すオブジェクトとなります.一般に,代入可能な左辺値となり,だから*p=1で,指し示す先の値を1にセットするわけです」
「はい,それは分かります」
「では質問.*p=1という代入で,pの値は,変わりますか?」
「はい,1になります」
「なんでやねん」
「pの指す値,ですよね?」
「おっと,もしかしてまだ,ポインタを実感していない??」
「あ…そうかもしれません」
「じゃあ答えを言うと,pの指し示す先のオブジェクトは,1になりますが,ポインタ変数のpの値は,その代入では変化ありません」
「変化ないんですか…あ! そういうことですか!!」
「お,ポインタが見えてきたかな」
「そうかもしれません!」
「よしじゃあそのテンションで,参照渡しの効果を,関数,実引数…」
「やってみます」
「どうぞ」
「参照渡しでは,関数の仮引数がポインタ変数で,その指し示す先が実引数となります.したがって,間接演算子*を仮引数につければ,実引数の値を参照したり,値を変えたりすることができます」
「うん,それでいいかな」
「やった!」

すんません,まだ続きます.