妹とアドレス
「お兄ちゃん、変数の交換ができないんですけど……何でですかね?」
そう言って俺にMacBookを差し出してくる。
どうやらCのようだが……ああ、アレか。
大体の当たりをつけた俺は交換用の関数を見てみる、やっぱこうなるわな。
「引数で渡してるのがデータだからだよ。こういう時はアドレスを渡せばいいぞ」
「アドレス?」
&I
これ、&をつけて渡せばメモリアドレスが向こうに行くからそれを関数側でアドレスから引っ張ればいける。
「関数側に*をつけるの忘れないようにな、忘れるとメモリアドレスが変わるぞ」
「うーん、よくわかんない……」
そうだよな、俺もそれでやらかした口だからよく分かる。
「変数の箱モデルは分かるか?」
「変数は箱でそこに入るのがデータだっけ?」
「そうそう、この説明だとわかんないよな。箱が10個並んでるところを考えてみるといい」
「やっぱり箱なの?」
「五番目の箱のデータを引数で渡すとどうなるか分かるか?」
「五番目の箱を渡すんじゃないの?」
「いや、『箱は渡さない』んだ。渡されるのは箱の中身の『コピー」だ」
「え? じゃあ中身はどうやって変えるの?」
「そもそもプログラミング言語は大抵のやつに変数を返すのが関数の役目で関数外のデータをいじらないのがいいマナーとされてたんだ」
「実用性ガン無視の理想論ですね」
「まあまあ、そこでCでは関数外のデータ操作にはポインタかグローバル変数を使うわけだ」
「グローバル変数はあんまりよくないって聞いたけど……」
「実際必要も無く使うもんじゃないが……それはさておき、さっきの箱モデルだと何を渡せばいいと思う?」
「中身を渡すとコピーが渡されるんだよね……うーん」
「答えはアドレスを渡す、だ。さっきの箱モデルで言えば箱の場所を渡して中身を操作してくれるように頼むんだ」
「5番目と6番目を入れ替えたいと思ったら、5と6を渡すの?」
「そうだな、察しがいいぞ。メモリアドレスはもっと複雑なんだが、平たく言えばさっき未来の言ったとおりだ、5と6の書かれた紙を渡してこの紙の番号の箱の中身を交換してください、と命令するといける」
「なんでこんな面倒なの?」
「一回だけ書くちょっとしたものなら確かにちょっと面倒だけど、実体の交換してたら早々にどこがおかしいのかすらわかんなくなってくる、昔の言語にはポインタ渡しが無く全部グローバル変数な言語もあったが、保守はひどい目に遭ったそうだ」
「グローバル変数使っただけでしょ? そんな面倒なの?」
「どこで何が変わったか分からないって怖いんだぞ。バグの特定もままならなくなる」
「昔の人は大変だねえ……」
「いい時代になったもんだと思うよ、ついでにgotoも歴史の闇に葬って欲しいがこっちは残ってるな」
「お兄ちゃんは何か言語で嫌いな機能とかってある?」
「ビルドシステム」
「ええ!? 手作業でビルドするの?」
「いや、IDE前提なのはともかく何とは言わんが低レイヤのことができる言語でビルドをIDE任せにしてるのってあんま好きじゃないんだよな」
「じゃあ一々コマンド入力するの?」
「それは一歩譲ってMakeだな、Makefileはもちろん全部手書き」
「超面倒くさいですね」
「それがいいんだよ、古い人間なのかもな」
「私とそんなに違わないでしょうに……お兄ちゃん時々年寄り臭いね」
「ほっとけ、それはともかく交換関数swapができたぞ」
「どれどれ」
そう言いながらさっき俺に差し出したMacBookをひょいと受け取ってキーボードをたたいている。
ちょっとの間そうしていたかと思うとうれしそうに言った。
「お兄ちゃん大好き! ありがとね!」
そう言うだけ言って部屋に帰っていった。




