詳説 Cポインタ

[cover photo]
オライリー・ジャパンで書籍を購入:
定価2,376円

Ebook Storeで電子版を購入:
価格1,901円

ポインタはC言語を習得する上での最大の壁と言われ、マスターすることが難しくポインタで挫折するプログラマも少なくありません。しかし、一方でポインタをひとたび理解すると、柔軟で効率的なプログラムを書くことができます。本書はC言語のエキスパートとなるために避けては通れないポインタについて、図とコードを多用して、視覚的かつ直観的な理解を促します。また、プログラムが動作するためのメモリ構造と管理方法についても理解できるので、Cに限らず他の言語(JavaやC++、C#など)のプログラマにも役立つ内容となっています。

関連書籍

Binary Hacks
C実践プログラミング 第3版
GNU Make 第3版
Head First C

訳者まえがき 
はじめに 

1章 ポインタの復習 
    1.1 ポインタとメモリ 
        1.1.1 ポインタの達人を目指せ 
        1.1.2 ポインタ変数の宣言 
        1.1.3 ポインタ宣言の読み方 
        1.1.4 アドレス演算子 
        1.1.5 ポインタ値の表示 
        1.1.6 間接演算子によるポインタの間接参照 
        1.1.7 関数へのポインタ 
        1.1.8 nullの概念 
    1.2 ポインタ型とポインタの大きさ 
        1.2.1 メモリモデル 
        1.2.2 ポインタに関係する定義済みの型 
    1.3 ポインタ演算子 
        1.3.1 ポインタ演算 
        1.3.2 ポインタの比較 
    1.4 ポインタの一般的な使い方 
        1.4.1 多重間接参照 
        1.4.2 定数とポインタ 
    1.5 まとめ 

2章 C言語の動的メモリ管理 
    2.1 動的メモリ割り当て 
        2.1.1 メモリリーク 
    2.2 動的メモリ割り当て関数 
        2.2.1 malloc関数の使い方 
        2.2.2 calloc関数 
        2.2.3 realloc関数の使い方 
        2.2.4 alloca関数と可変長配列 
    2.3 free関数によるメモリの解放 
        2.3.1 解放済みポインタに NULLを代入する 
        2.3.2 二重解放 
        2.3.3 ヒープメモリとシステムメモリ 
        2.3.4 プログラム終了時のメモリ解放 
    2.4 ぶら下がりポインタ 
        2.4.1 ぶら下がりポインタの例 
        2.4.2 ぶら下がりポインタの解決法 
        2.4.3 メモリリークを発見するためのデバッグ版コンパイル 
    2.5 動的メモリ割り当て技術 
        2.5.1 C言語のガベージコレクション 
        2.5.2 リソース取得時の初期化 
        2.5.3 例外処理 
    2.6 まとめ 

3章 ポインタと関数 
    3.1 スタックとヒープ 
        3.1.1 スタック 
        3.1.2 スタックフレームの配置 
    3.2 ポインタを関数に渡し、関数からポインタを返す 
        3.2.1 データのポインタを関数に渡す 
        3.2.2 関数への値渡し 
        3.2.3 定数へのポインタを関数に渡す 
        3.2.4 ポインタを返す 
        3.2.5 局所変数へのポインタ 
        3.2.6 nullポインタを関数に渡す 
        3.2.7 ポインタへのポインタを関数に渡す 
    3.3 関数ポインタ 
        3.3.1 関数ポインタの宣言 
        3.3.2 関数ポインタを使った関数呼び出し 
        3.3.3 関数ポインタを関数に渡す 
        3.3.4 関数ポインタを関数から返す 
        3.3.5 関数ポインタの配列 
        3.3.6 関数ポインタの比較 
        3.3.7 関数ポインタのキャスト 
    3.4 まとめ 

4章 ポインタと配列 
    4.1 配列の復習 
        4.1.1 1次元配列 
        4.1.2 2次元配列 
        4.1.3 多次元配列 
    4.2 ポインタ記法と配列 
        4.2.1 配列とポインタの違い 
    4.3 mallocを使った 1次元配列の作成 
    4.4 reallocによる配列サイズの変更 
    4.5 1次元の配列を関数に渡す 
        4.5.1 配列記法 
        4.5.2 ポインタ記法 
    4.6 ポインタの 1次元配列 
    4.7 多次元配列とポインタ 
    4.8 多次元配列を関数に渡す 
    4.9 2次元配列の動的割り当て 
        4.9.1 非連続となる可能性のあるメモリの割り当て 
        4.9.2 連続メモリの割り当て 
    4.10 ジャグ配列とポインタ 
    4.11 まとめ 

5章 ポインタと文字列 
    5.1 文字列の基礎 
        5.1.1 文字列の宣言 
        5.1.2 リテラルプール 
        5.1.3 文字列の初期化 
    5.2 標準的な文字列操作 
        5.2.1 文字列の比較 
        5.2.2 文字列のコピー 
        5.2.3 文字列の連結 
    5.3 関数へ文字列を渡す 
        5.3.1 関数へ単純な文字列を渡す 
        5.3.2 関数に const charへのポインタを渡す 
        5.3.3 関数に渡した文字列を初期化する 
        5.3.4 プログラムにパラメータを渡す 
    5.4 関数から文字列を返す 
        5.4.1 関数から文字列定数を返す 
        5.4.2 動的に割り当てたメモリを関数から返す 
    5.5 関数ポインタと文字列 
    5.6 まとめ 

6章 構造体とポインタ 
    6.1 イントロダクション 
        6.1.1 構造体のメモリ割り当て 
    6.2 構造体のメモリを解放する時の問題 
    6.3 malloc/free関数のオーバーヘッドを最小化する 
    6.4 データ構造とポインタ 
        6.4.1 単方向リンクリスト 
        6.4.2 キューとポインタ 
        6.4.3 スタックとポインタ 
        6.4.4 ツリーとポインタ 
    6.5 まとめ 

7章 セキュリティの問題と不適切なポインタの使用 
    7.1 ポインタの宣言と初期化 
        7.1.1 ポインタ宣言の誤り 
        7.1.2 初期化し忘れたポインタの使用 
        7.1.3 ポインタの初期化忘れにどう対処するか 
    7.2 ポインタ使用時の問題 
        7.2.1 NULL値のテスト 
        7.2.2 間接演算子の誤った使用方法 
        7.2.3 ぶら下がりポインタ 
        7.2.4 配列の範囲外へのアクセス 
        7.2.5 誤って算出された配列の大きさ 
        7.2.6 sizeof演算子の誤用 
        7.2.7 ポインタの型は常に合わせること 
        7.2.8 境界付きポインタ 
        7.2.9 文字列に関するセキュリティ問題 
        7.2.10 ポインタの算術演算と構造体 
        7.2.11 関数ポインタの問題 
    7.3 メモリ解放に関わる問題 
        7.3.1 二重解放 
        7.3.2 重要なデータのクリア 
    7.4 静的解析ツールを使う 
    7.5 まとめ 

8章 残りの話題 
    8.1 ポインタのキャスト 
        8.1.1 特殊な目的を持つアドレスへのアクセス 
        8.1.2 ポートへのアクセス 
        8.1.3 DMAを使ったメモリアクセス 
        8.1.4 コンピュータのエンディアンを判定する 
    8.2 別名、厳密な別名、 restrictキーワード 
        8.2.1 unionを使って複数の方法で値を表現する 
        8.2.2 厳密な別名 
        8.2.3 restrictキーワード 
    8.3 スレッドとポインタ 
        8.3.1 スレッド間でポインタを共有する 
        8.3.2 関数ポインタとコールバック 
    8.4 オブジェクト指向テクニック 
        8.4.1 不透明ポインタの宣言と活用 
        8.4.2 C言語におけるポリモーフィズム 
    8.5 まとめ 
 
索引

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。


詳説Cポインタ 第1刷正誤表

2014年2月5日更新

位置
p11
15行目
printf("%p\n",*pi); // 5が表示される printf("%d\n",*pi); // 5が表示される
p109
図4-14
の下
1行目
arr3d[1][0]は、2行目の最初の列を表し、要素数5の1次元配列へのポインタとなります。 arr3d[1][0]は、2行目の最初の列を表し、要素数4の1次元配列へのポインタとなります。
p131
図5-10
の下
5行目
次のようにstrcpy関数を使ったとしましょう。この例はstrcpyから返されるポインタを配列の名前に代入しているために、シンタックスエラーとなります。 次のようにstrcat関数を使ったとしましょう。この例はstrcatから返されるポインタを配列の名前に代入しているために、シンタックスエラーとなります。

Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]