o3c9

4 minute read

これより前にC言語の本を読んだのは、きっと10年以上前のことだろう。学生時代のコンピューターサイエンスの授業の準備だったり、新卒で入った会社の音声合成ライブラリの実装がC++で再勉強したりしたのは、20代半ばの頃だった。

あれからソフトウェア・エンジニアとして、C++・Java・Ruby・Python・JavaScript・Goなどを使って労働してきたわけだけど、あらためてC言語を触ってみると、古びてないと感じてしまう。もちろんC言語自体の新しい規格が提案され言語自体が少しずつ進化している、というのもあるが、やはり今流行の言語は暗に陽に何かしらC言語から影響を受けている、というのがその大きな理由だろう。

そんなわけでさしたる苦労もなく、C言語を使って、Arudinoのコードを書いていたわけなのであるが、UTF8文字列の処理など、だんだん複雑なコードを書く必要が出てきて、本書「C言語ポインタ完全制覇」を手に取ったのである。

対象読者は、

ふだん、なに不自由なくCを使っているが、実は理解が曖昧な人

うん、まさにぼく。

配列名をポインタに代入することを習ったあたりで、配列とポインタを混同してしまい、「領域を確保してもいないポインタを、配列としてアクセスする」とか、「配列名にポインタを代入しようとする」とかいう過ちを犯す。

うん、まさに。

double (*p)[3]void (*func)(int a); といった宣言の読み方がわからない

うん、まさに。

というわけで、対象読者ど真ん中にあてはまり、笑ってしまった。

本書の構成は、こういった問題提起の序文の後、これまでの歴史を振り返りながら、みんなが知りたいポインタ、メモリアドレス、配列などの基礎を復習、その後サンプルコードを多用して実際にコードを書いては動かしてみながら、C言語のメモリの使い方をつぶさに観察しながら説明を加えていく。

これらの実験の後に、C言語の文法の本質に迫る第3章は、まさに永久保存版だ。C言語を扱う人なら、一度ならず手元に置いて見直す習慣を持っておいて損はない。

第4章は、期末テストといった趣きで、これまで習ったことをもとに、一行の長さも行数もわからない汎用的なファイル読み込み関数を書く、というプロジェクト。ここは、写経するだけではなく、サンプルコードを見ずにまずは自分で書いてみてほしい。一行は、1KBまでで、char linebuf[1024]; なんて制限を勝手につけないで。ちゃんとmalloc & reallocで動的にメモリ領域を確保しながら、普通にファイルを読み込めるようになりましょう。

そして、第5章は、卒業制作2つ分。正直第4章まできちんとこなすことができていれば、この章でC言語そのものについて新たに学ぶことはなく、完全に腕試しといったところだ。ドローツールのプログラムはなかなか面白いので、取り組んでみてもいいと思う。ただ作者が言うように、ポリモーフィズムが欲しい状況ではあるので、もはやCではなくてC++など別の言語を選ぶというのが正解なのだが。

中級者、または、たまにC言語に触れることのあるエンジニアにとてもおすすめできる本だと思う。作者の軽妙な語り口は、K&Rの翻訳調にはない読みやすさがあるし、きちんと動くサンプルコードが提供されているので、macだろうがlinuxだろうがはたまたarudino環境だろうが関係なく動かすことができる。

実際、サンプルのいくつかをesp32で動かしてみたのだけど(stdoutがないので、かわりにSerial.printを使った)、もちろんちゃんと動く。こういったポータビリティーがC言語がいまだに必要とされている理由だろうな。

電子工作をやっていても、ときにはがっつりとファームウェアを書く必要があるだろう。そんなときに、この本を手にして、C言語をきっちり手なずけておくと、怖いものなしになる。

最後に、本書を読みながら気になった点があったとき、作者の掲示板に質問を投稿したところ、丁寧に返信をいただけてうれしかった。

comments powered by Disqus