C 言語ポインタ完全制覇

C 言語ポインタ完全制覇読了しました。
いろいろ手を出してきての今更感ある C 言語の勉強ですが、戻ってきた価値は大いにありました。
今まででもそれなりに (大きくないプログラムの) ソースを読む程度なら問題なく行える程度でしたが、特殊なイディオムやテクニックが入ってくると途端に頓挫する能力でした。
その原因が大体ポインタと構造体の組み合わせだったのですが (アルゴリズムもですが)、まぁ今まで突っ込んでやってこなかったのが問題だったので、今回はその辺り避けずに Web ブラウザとよろしくしながら勉強しました。

技術評論社からの引用で目次です。

第0章 本書の狙いと構成 ―イントロダクション
第1章 まずは基礎から ―予備知識と復習
第2章 実験してみよう ―Cはメモリをどう使うのか
第3章 Cの文法を解き明かす ―結局のところ,どういうことなのか?
第4章 定石集 ―配列とポインタのよくある使い方
第5章 データ構造 ―ポインタの真の使い方
第6章 その他 ―落ち穂拾い

全体の感想から言えば、C 言語の文法がいかに適当な仕様によって成り立っていたかというものを知らされる内容でした。特に配列とポインタの関係はコンパイラによる式の読み替えのおかげで混迷を極める結果になっています。自分がまとも (あくまでも自身の中で) に C を書いたときに配列の宣言ポインタの宣言でエラー祭りだった理由が学べました。そして、世に出回ってる C の教本、特に大学でよく使われている自称分かりやすい本 (という名前の本) がいかに見当違いの説明をしていたのかを理解しました。

他の本のイケてなさをここに書いても仕方が無いので内容に移ります。
先ず、対象読者は C の文法を全体的に知っている人 (制御構造、関数定義、配列、ポインタ、構造体、列挙体、共用体) です。ですが、正直、構造体、列挙体、共用体は知らなくてもこの本である程度解説が入ってるので、そんなに困らないです。どうしても分からなかったらその場で Web で調べる程度で十分でした。

配列とポインタの関係性に入るまでに C 言語のアドレスの扱いなどがソースを用いて説明されていますが、変数や関数、スタックのアドレスの取り方を実際に出力しながら説明してるのでここで把握するのが今後のイメージを掴めるかが肝になる構成です。OS 関係の本は読んでいた (といっても簡易的に解説してる程度の本ですが...) のでメモリの扱い等は何となく把握していましたが、C のメモリの取り方を見て再帰を行いすぎると何故スタックが溢れるのかが明確に理解できました (とは言えどのようにアドレスに配置するかは処理系依存らしいですが)。スタックのメモリ消費の仕方は把握しておく方が何かと捗る事はよくわかります。

途中 quick sort の話が出てきますが、試しに 1000 万個のデータをソートしたところしっかりスタックが溢れて処理できませんでした。
末尾再帰なら溢れないと思いますが面倒だったのであきらめました。
gist: quicksort.c

残る半分は配列とポインタの関係性と、C 言語に於ける定石について割かれています。この辺りも余裕があるなら読むべきです。ダーティなテクニック含め、様々な見解が書かれているのでコードをコレから書くにせよ読むにせよ役立つと思います。少なくとも自分は構造体の使い方等々多くの事が初見であったため面白く、後半の方が集中力高く読めました。

この本は、著者の書き方がとてもフランクで学ぶ事への抵抗を薄れさせるとともに解説が巧く理解しやすかったのがとにかく印象的な本でした。現在、教育を仕事にしてる人間としても学ぶべき事は多かったです。著者に感謝。