C言語ポインタ完全制覇

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

C言語のポインタを使うと、配列のようにアクセスすることができます。しかし、ポインタと配列はメモリ上のイメージが根本的に異なります。ポインタを理解しているかどうかは、関数の仮引数に二次元配列を渡すコードを書けば、おおよそわかります。が、経験上、C言語のプログラミング経験者でも案外書けなかったりすることが多いようです。
この本の趣旨は、

  • C言語における」ポインタ記述を正確に把握する

ことにあります。また、これと同時に、

  • プログラムのメモリ上のイメージを捉える

ための入門書として良書だと思います。特に、ポインタと配列の違いを正確に理解できていない人にはうってつけの本と言えるでしょう。プログラムのメモリイメージの話題を正確に取っ付きやすく記述した文書は手直に案外なかったりするので、ポインタに対する理解を助ける本として重宝してます。
C言語に限らず、プログラミング言語の文法書には、言語の記述ルールが一通り説明されていますが、記述したプログラムのメモリイメージまで説明されている本は少ないです。スクリプト言語のように、メモリイメージを意識せず、アルゴリズムの記述に集中できる言語もあります。しかし、リアルタイムアプリケーションを記述する場合、DMA転送時のメモリアラインメント、ネットワーク上のバイトオーダーなど、メモリイメージを意識してプログラムを組む機会が出てきます。また、プログラムの半永久動作を要求される場合には、メモリリークや配列のバッファオーバーランが問題になってきます。C言語はメモリの解放し忘れや配列のバッファオーバーランを実行時に検出する仕組みを持ちません。したがって、デバッグ時にプログラムの挙動を脳内のメモリ空間に展開できるとデバッグの手がかりになることがよくあります。
以下、この本の概要です。

  • 第0章 本章の狙いと構成――イントロダクション
    • 本書の概要
  • 第1章 まずは基礎から――予備知識と復習
    • C言語の生い立ち(C言語は基本的にスカラしか扱えない言語)
    • ポインタ演算
    • p[i]は*(p+i)の簡便記法。添字演算子[]は配列とは無関係
  • 第2章 実験してみよう――Cはメモリをどう使うのか
    • 仮想アドレス
    • 分割コンパイルとリンク
    • 自動変数とスタック領域
    • malloc(), free()とヒープ領域
    • アラインメント
    • バイトオーダー
  • 第3章 Cの文法を解き明かす――結局のところ、どういうことなのか?
    • Cの複雑な宣言文の読み方
    • C言語に多次元配列は存在しない。存在するのは、配列の配列
    • 式中における配列→ポインタの読み替え
    • const
    • typedef
    • 文字列リテラル
    • コンパイラによって特別に解釈される空の[]
  • 第4章 定石集――配列とポインタのよくある使い方
    • 多次元配列を関数に渡す、関数から返す
    • 可変長配列
  • 第5章 データ構造――ポインタの真の使い方
    • 単語の出現頻度を求めるプログラム
      • 連結リスト(一方向、双方向)
      • 二分探索
      • ハッシュ
    • ドローツールプログラム
    • データ構造におけるポインタは手続きにおけるgotoに相当するもの。しかし、ポインタがなければ、まともなデータ構造は構築できない
  • 第6章 その他――落ち穂拾い
    • strncpy()はコピー先を'\0'で終端しない
    • 可変長引数を取る関数のプロトタイプ宣言は大事
    • 構造体、共用体
    • (UNIX系)C言語グローバル変数の多重定義をエラーとしない