こんにちは、「2019年で最も伸びた言語は、PythonではなくC言語」というTIOBE Indexのニュースを見てちょっと小躍りした、スッキリC著者の中山です。
今回は、Amazonレビューなどでも、ありがたいことにご好評いただいている「ポインタ」について、執筆舞台裏も含めてちょこっとご紹介&アピールさせていただきます! 最後まで読んでくださった方には、なんと「無料でスッキリCをよめる」特典をプレゼント!(終了しました)
スッキリCの心臓、第III部!
Amazonとかで目次をみていただくと、スッキリわかるC言語入門は、16個の章と6つの付録から構成されていることがわかります。なかでも、第9章から第12章が、泣く子も黙るC言語の学習難所「ポインタ」まわりを紹介する章です。
スッキリわかるC言語入門 第III部
第10章 メモリアクセスのからくり
第11章 文字列操作
第12章 パズルRPGの製作
この第III部のポイントは、「ポインタ自体は実は難しくない」という重要な鉄則に基づいて整理されている点です。実は*演算子や&演算子といった「狭義のポインタ構文」って、拍子抜けするほどシンプルで本来そんなにビビるもんじゃないんですよね。
そう、「難しい」とか「挫折した」っていう人がいうポインタって、ほぼ間違いなく
ポインタ自体じゃなく、 ポインタの周辺
なんです。
その「周辺」である2つを、10章と11章で、1章ずつ倒していきます。第10章では「配列変数を単に表記すると先頭リテラルへのアドレスに勝手に解釈される」等の、初心者いじめとしか思えない特殊構文ルール。続く第11章は、「¥0までしか使わないという"文字列文化"が、標準関数やら変数宣言構文とかにも特殊な影響を与えている件」。
この2つの領域に共通するのは、「C言語をマスターしている人ほどうまく教えるのが難しい」という点。それらはC言語の構文や標準関数に不思議な1密結合をしていて、あちこちに微妙に顔をだしたりひっこめたりするものだから、いわゆるC言語マスターたちのなかではスキルが「血肉」として解けてしまっていて、意識して言語化しようとすると難しいんです。例えば、
scanf("%s,%d", name, &age);
とか、マスターしている人はしれっと書いてしまいます。これ、本来は配列変数のアドレス解釈・文字列文化などを知っているからこそ書ける1文なんですけど、教える側の先輩には「入門書ではよくわからなかったんだけど、繰り返し繰り返し、いろんなコードを読んだり書いたりしているうちに、書き方がわかってきた」という人も多く、「プログラムとして書けるけど、なぜこう書くのかとかあまり考えたことなかった」ということも少なくないんですよね。その感覚こそ、血肉になっているという証拠なんですから。
それを1つ1つ、地味ぃに紹介しつつ、最終的にはそれを学び手の人に血肉にしていただけるようパズルRPG開発演習を第12章として準備してあります(パズルRPG Puzmonについては、こちらの紹介記事をご参照ください)
でも、そこじゃない。
「4つの章で168ページしかないじゃないか! ブログタイトルで"468ページもかけてポインタ解説してる"とか、300ページも数字盛ってんじゃねーよ!」
とJAROに電話をかけようとしたそこのあなた。ちょっとだけ待ってやってください。2 たしかに、ちょっと丁寧な入門書であれば、ポインタと文字列に150ページぐらい割くのは別に珍しいことではありません。
でもですね、、、
スッキリCのポインタ解説がわかりやすいと感じていただけたとしたら、それは、実はそこじゃないんです。
ポインタ解説の鍵は、第I部と第II部に。
実はスッキリCのポインタ解説の鍵は、第III部ではなく、第I部と第II部にあるんです。
第I部と第II部は、変数や制御構文、配列や関数といったものを扱う、いわゆる基本構文入門。一見するとただの「やさしくたのしいC言語入門」的なノリなんですが、第III部のポインタ学習に向けての伏線を学び手にばれないように張り巡らせることを何より重要視して執筆しました。
まず徹底的にポインタに関する「におい」を消して、PythonとかBASICみたいな「高級言語」感覚で楽しんでいただけるようにしています。これは「ポインタ以外を事前に完璧にマスターしておいて欲しい」から。制御構文とか変数とか関数とか、それらはわかったって思えれば、読者の方は第III部で「強敵ポインタだけを相手すれば良い状況」になります。3
そして、最大の特徴が、1章でのString型(char[1024]のtypedef)の導入です。いや、我ながら迷いましたよ...さすがに。10年前の自分なら、
「てんめぇ、char[1024]をtypedefしてString型だとぉぉぉ...?!」
と、ろくでなしブルースまたはクローズZERO的なメンチを切るところです。
・・・でもまぁ、著者が「どうせ低脳で邪道なやつにちがいない」とかいわれさえすれば、読者の人はとりあえずスムーズには学べるわけですから、その道を選ぶことにしました。このString型という道具を導入してポインタの存在を隠蔽するとともに、必要な伏線をはるために用いたのが、「7つの約束」だったんです。
そしてこの伏線が「じっくり読者の中に染みこんでいる」からこそ、第III部でその謎が解けることで、たのしく・わかりやすく感じやすくなるという解説設計なんです^^
異議あーり!
「第I部・第II部・第III章すべて足しても452ページじゃねぇか! あと16ページ足りねぇぞ!」
という鋭いあなた。「ー」と「—」と「一」の違いを見分けてしまうぐらい細かいあなたのことは認めますから、JAROへの電話はもう少しまってください。
スッキリCでは、実は、第0章から「ポインタ解説のための仕込み」がなされているんです。ひとことでいうと「hello world」とか体験する章なんですが、仕込みはさらにその前。実質「この入門書の2ページ目」にあります。
なぜかカリオストロの風を感じる人もいらっしゃる、この4名。実はそれぞれ「第III部のためのミッション」を背負って設定されているんです。
たとえば、「赤城ゆり」という登場人物。「あぁ、スッキリJavaでいう「朝香さん」とおなじ、優等生ポジションなのねー」と思われがちなんですが、彼女のスゴい生い立ちと性格が第III部であきらかになるんです。そしてそれは、「C言語という言語の特徴と必要性を象徴する」ものであって、また別の「象徴」を背負う富士子ちゃん峰子さんと両面から、岬くん(主人公役)のポインタへの理解を陰に日向に誘導する役割を担っています。
スッキリCのストーリーを楽しもう!
スッキリシリーズの中でいうとJavaがやはり有名だったりはするのですが、C言語のほうが比べものにならないぐらい多くの「解説のための工夫」と「伏線&回収の作り込み」を盛り込んだと著者としては思っています4。
Amazonの「なか見検索」などでも、一部のページサンプルを読むこともできますので、楽しんでいただけたら幸いです。