新・闘わないプログラマ No.185

指し示す


先日、何かネタがないかなあ、と本屋で立ち読みをしていると、「C MAGAZINE」2001年7月号が目に止まりました。「特集 ポインタのすべて」という文字が…。
以前ここで書いたように、「C言語 ポインタ完全制覇」という本も出版されたし、私が知らないだけで、もしかして世間では「ポインタ」が流行っていたりするんですか? 「いま巷では、ナウなヤングに『ポインタ』がバカウケ」とか言って。
それはともかく、何かのネタになるか、と「C MAGAZINE」を買ってしまった私だったりします。よく考えたらこの雑誌を買うのは初めてのような気もする。

さてさて、C言語(C++でもいいけど)のポインタは難解である、というのは定説になっているわけですけど、ではいったい何故難解なのか、というと、なんでなんでしょうね。
まあ、いろいろ考えられる要因はあるわけですけど、やっぱり一番ややこしくなる原因を作っているのは配列におけるポインタ生成の規則なのかな、などと思ったりもします。つまり、配列「a」があったときに、式の中で「a」と配列名を書くとそれは(少数の例外を除いて)配列の先頭要素を指すポインタになる、ってやつ。
この規則があるために、配列とポインタを混同する初心者(だけじゃなかったりして…案外)が後を絶たない、ってのはもう何度も何度も何度も何度も何度も何度も何度も何度も指摘されていることだったりするわけですね。
確かに、私もCを教えていて、ポインタと配列は違うものだ、としつこいくらい言っても、式に書くとポインタも配列も同じように書けちゃう(ことが多い)ので、やっぱりみんなどうしても混同してしまうようです。
配列におけるポインタ生成規則って、その考え方自体はなかなか面白いと思うし、C言語のような位置付けの言語としては便利だと思うわけで、もしこの規則が無かったら(配列もANSI Cの構造体のような感じだったら)、「&」演算子を多用しないといけないし、結構ごちゃごちゃするかな、などと思ったりもするわけです。

ところで、ポインタとは何か、というのを説明するときに「アドレス」という言葉を使うことがよくあるわけですけど、「ポインタ」と「アドレス」の関係はいったい何なんだ、というと、特に初心者に説明するのは結構難しかったりします。
そもそも、C言語では、「アドレス」という言葉を基本的には出さなくてもポインタの説明は出来る(はず)ですし、C言語でプログラミング(デバッグは除く?)する場合でも基本的にはアドレスは意識する必要は無いわけですけど、でも、じゃあそれでうまく行くか、というと、それがなかなか…。
そういえば、前橋さんも書かれていたし、「C MAGAZINE」の特集でも書かれていましたが、規格やK&Rで「アドレス演算子」と言う言葉が出てきたりして、じゃあいったい「アドレス」とは何ぞや、という話になったりするかも知れません……C言語の規格で「アドレス」っていう用語は定義されてましたっけ? K&Rではいきなり「アドレス」と言う言葉が出てきましたけど。

さて、せっかく買った「C MAGAZINE」の特集、全然ネタにしないのもなんなので(と言っても、私自身、全部は読んでいるヒマが無かった)、一つだけ…
(「C MAGAZINE」2001年7月号、ソフトバンク パブリッシング刊、「特集1 All about pointer ポインタのすべて」文:きだあきら氏、27ページ)

「p + i」のようにポインタpに対してオフセットiを加える場合には、機械語レベルでは「(long)p + sizeof(*p) * i」といった演算が行われているのです(ここではポインタのビット幅とlongのビット幅が等しいと仮定しています)。

ワードマシンなんかの場合は必ずしもこういう演算はしないような気もするのですけど、どんなもんなんでしょ? そもそもそういうアーキテクチャがいま現在においてどれだけ一般的か、って話もありますし、単なる揚げ足取りになってしまっているかな、これじゃ。
そもそもワードマシンにおける実装で、例えば「int *」と「char *」の内部表現がどう違っている(それとも同じである)のが普通なのか、いまいちよく知らない私だったりするので、大きなことは言えないんですけどね。でも、違うポインタ型であれば、内部表現が異なっていても構わないはず、規格上は。で、常に「sizeof(*p)」を掛けるのはどんなもんだろう、と思ったわけです。
そういえば、char型は1バイトで、8ビット以上、って規格上はなっていたと思うのですが、「この『以上』っていったい何だ? 1バイトは8ビットに決まっているじゃないのか」という話題があって、そういう特殊なアーキテクチャ(一般的になれなかった、という意味で)方面を追求するのは、面白いことは面白いけど、あまり役には立たないかな、などと思ったりもするわけです。
まあ、とにかくこの特集、比較的少ないページ数で、C言語のポインタについてかなり分かりやすく書かれていますから、「C言語を勉強したけど、ポインタはなんだかよく分からなかった」という人が読むにはいいのではないか、と思います。

というわけで、C言語のポインタは難解だと言われている、というお話でしたが、「難解だからいけない」と言うわけでもなく、ちゃんと覚えれば「なんだ、おめー、ポインタもわからんのかよー」と言って優越感に浸る、という技も使えるわけでして…。

[前へ] [次へ]

[Home] [戻る]


mailto:lepton@amy.hi-ho.ne.jp