FC2ブログ

PCで: C言語のポインタの理解の仕方

 『さくら荘のペットな彼女(4)』を読んでいたら、プログラミングの勉強をしている主人公の空太が、ポインタがよくわからんと悩んでいました。
 シリーズの最初の頃、何の言語を勉強しているか書いてあったような気もしますが忘れました。でもまあ、ポインタというからには、CかC++でしょうね。
 ゲームの世界って、どういう言語が主流なのかな?

 さて、昔、どっかの食堂で昼食をとっていたら、隣のテーブルの人が、プログラミングの話をしていました。で、一言。
「ポインタがわかる人って、ヘンだよねー」

 …………そうかぁ?
 まあ、確かに、解説本とか見ると、大概ポインタは難解だとか書いてあります。
 でもそれは、本来ならば初歩中の初歩であることを知らずにCを学ぼうとしているからでは?

 ならば私が、ポインタを理解する一番の早道を、そしてそれの代替手段をも示しましょう。
 ポインタを理解するにはどうするか。

 ちょこっとでもいいから、アセンブラを勉強すればいいんです。

 アセンブラ。昔はアセンブリ言語と言いました。コンピュータが理解できる命令と一対一に対応する言語です。アセンブリ言語で書いたプログラムを、アセンブラというプログラムで変換して、コンピュータが理解できる形式に変換するわけですけど、いつの間にかその言語自体がアセンブラと呼ばれるようになりました。

 私がコンピュータに関心を持った頃、身近にあったのはTK-80でした。結局実際に触れることはありませんでしたが、それを使うための解説本とかを読みました。プログラミングの初歩の本も。
 あんな貧弱なマシン?に、高級言語があるわけがありません。当然ながら、プログラミングは全てアセンブラです。

 さて、その後しばらくの空白を経て「パソコン」に触れたのが、大学生の時。NECのPC-8801mkIIです。
 N88-BASICでプログラムを作ったりしてましたが、アセンブラにも手を出しました。
 ちなみに、初めて作ったプログラムは、姓名判断的に「良い」画数の名前(ペンネーム)を作るために、色んな画数の組合わせを片っ端から試す、というものでした。そうして作ったペンネームの苗字が「水響」です(笑)。下の名前は違いますが。

 閑話休題。
 その頃、パロディ版ASCIIという、雑誌の増刊みたいなのを読みました。そこに、UNI+というN88-BASICのプログラムが載っていて、そこからUNIXというOSがあることを知ったのでした。
 必然的に、C言語とも出会うことになったのです。
 思いました。
 こ、これは便利だ……!
 アセンブラよりもずっと楽に書けて、でもアセンブラみたいなことができる。

 所謂高級言語は、大概、色んなことを抽象化していて、アドレスを意識してメモリを直にいじったりできないんですよね。まあ、N88-BASICにはpeekとかpokeとかありましたが。
 対してCは、それができる。
 ポインタは、アセンブラ的なメモリ操作をアセンブラよりも読みやすく書きやすいソースの上で実現できる、非常に魅力的な機能だったのです。

 つまり、メモリ上にあるデータをどう操作するかを意識していると、自然にポインタは理解できるのです。

 ところが。
 今の時代、アセンブラでプログラミングなんて大変ですよね。言語を学ぶには実際に書いてみるのが一番ですが、これだけ機能が揃ってくると、OSがプログラムを起動してから実際にやりたいこと(Cで言えばmain())に辿り着くまでのお約束が多すぎます。
 かと言って、高級言語から呼び出す形にするのも、やはり同じような問題があって大変です。

 というわけで、前述の通り、代替手段を紹介しましょう。

 CPUのレジスタとメモリ上でのデータの配置を理解しよう。

 キャッシュとかは初心者には関係ないのでスルーしていいでしょうし、ディスクとかは通常OSを介してアクセスするものです。
 だから、プログラムが直接アクセスするデータがどこにどういう風にあって、どういう風にいじるのか、それを知れば、ポインタ操作が何をやっているのかわかります。

 CPUがあって、メモリがある。
 CPUにはレジスタという作業用の記憶領域がある。
 メモリは、まあ今のパソコンとかなら通常、8bitのデータが入る枠がずーっと一次元に並んでいて、各「枠」には0から順番にアドレスと呼ばれる番号(数字)がついている。
 プログラムも単なるデータでこの辺りにあって、データがこの辺りにあって、スタックがこの辺りにあって、……。

 そんなのをイメージすると、ポインタ操作が何をしているのかがわかります。
 それを抽象化して直接メモリを意識することをしないからいけない。難しいと思ってなのか、そういうのを避けて、つまり基礎をサボっているから却ってわからなくなってしまう。
 そもそもC言語は何のために作られたか。アセンブラの代りです。そのためにポインタなんてものを用意したわけです。
 なら、アセンブラでやりたいのはどういうことか、それを理解すれば、ノープロブレムなわけです。

 というわけで、データがメモリ上にどのように置かれているか、それを意識しましょう。
 それができれば、ポインタなんて楽勝です。

コメント

非公開コメント

プロフィール

水響俊二

Author:水響俊二
水響 俊二 [MIZUKI Shunji]

暫定的に、18禁作品の感想などは裏サイトで書いています。
   

最新記事
最新コメント
カテゴリ
検索フォーム
リンク
RSSリンクの表示
月別アーカイブ
アクセス解析中