内容紹介
C言語習得の上で多くの人がつまづきやすい「ポインタ」および「メモリ管理」を詳しく解説!
ポインタはC言語を習得する上での最大の壁と言われ、マスターすることが難しくポインタで挫折するプログラマも少なくありません。しかし、一方でポインタをひとたび理解すると、柔軟で強力なプログラムを書くことができます。本書はエキスパートのCプログラマになるために避けては通れないポインタについて、図とコードを多用して、視覚的かつ直観的な理解を促します。また、メモリの構造について理解できるので、Cに限らずほかの言語(JavaやC++、C#など)のプログラマにも有益な内容となっています。
このような方におすすめ
学生、プログラマ、脱初心者を目指す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 まとめ
索引
続きを見る