ヒビノアワ: 変数についてどう説明するのがいいのだろうか
プログラミングをまったく知らない人に、どうやって説明するのかというプロセスに興味があるのですね。で、読んでいるとたいていの本で変数の説明として「箱」というメタファを出してくるのです。変数は箱のようなもので、Aという箱に数値を入れてうんぬん......。
私はセオリー通り(?)に変数を箱で覚えましたねぇ。元記事ではその後,話がポインタの話題になっているのですが,ここでは少し寄り道してみます。
「A」と書かれた箱があって,これに「123」と書かれたメモを放り込むことができます。これが変数Aです。他にも「B」と書かれたコップと「C」と書かれた紙袋があって,それぞれに「200cc」のミルクと「300g」の小麦粉を入れることができます。これで変数Bと変数Cができました。箱にはミルクを入れることはできませんし,紙袋にメモを放り込むこともできません(現実的に可能だとしても) この入れ物の違いが変数の型として説明できます。もし,無理矢理にコップに小麦粉を入れたい場合には、型変換(キャスト)を行うことで、異なる型同士でも値の交換が可能になります。
次に本題のポインタです。「A」と書かれた箱はボブの机の上にあって,「B」と書かれたコップはメアリーが持っていて、「C」と書かれた紙袋は台所にあります。このように,どの変数がどの場所に在るのか、という情報をポインタとして説明できます。
ここで少し話を飛躍して、話を現実のメモリ空間に近づけてみます。「A」と書かれた箱はコインロッカーの1900番に入っています。この「コインロッカーの1900番」というのがポインタの値です。そしてこの「1900番」という値の書かれたメモを箱に入れて,コインロッカーの2200番に入れておきます。これが「Aへのポインタ」です。2200番のロッカーを開けると,変数「A」へのポインタ「1900番」と書かれた紙が入っています。そして,1900番のロッカーを開けると,ようやく変数「A」の実体である「123」を得ることができるというわけです。
ややこしい「変数Aのポインタへのポインタ」も同じ考え方でいけます。上の例で、更に「2200番」と書かれたメモを2300番のロッカーに入れてしまえばよいのです。そして、2300番→2200番→1900番と辿ることで変数Aを得ることができます。
…と、こんな説明でどうでしょうか?