第1章 认识指针 1
1.1指针和内存 2
1.1.1为什么要精通指针 3
1.1.2声明指针 5
1.1.3如何阅读声明 6
1.1.4地址操作符 7
1.1.5打印指针的值 8
1.1.6用间接引用操作符解引指针 10
1.1.7指向函数的指针 10
1.1.8 null的概念 10
1.2指针的长度和类型 14
1.2.1内存模型 14
1.2.2指针相关的预定义类型 15
1.3指针操作符 18
1.3.1指针算术运算 19
1.3.2比较指针 23
1.4指针的常见用法 23
1.4.1多层间接引用 23
1.4.2常量与指针 24
1.5小结 29
第2章 C的动态内存管理 31
2.1动态内存分配 32
2.2动态内存分配函数 36
2.2.1使用malloc函数 36
2.2.2使用calloc函数 39
2.2.3使用realloc函数 40
2.2.4 alloca函数和变长数组 42
2.3用f ree函数释放内存 43
2.3.1将已释放的指针赋值为NULL 44
2.3.2重复释放 44
2.3.3堆和系统内存 45
2.3.4程序结束前释放内存 46
2.4迷途指针 46
2.4.1迷途指针示例 47
2.4.2处理迷途指针 48
2.4.3调试器对检测内存泄漏的支持 49
2.5动态内存分配技术 49
2.5.1 C的垃圾回收 50
2.5.2资源获取即初始化 50
2.5.3使用异常处理函数 51
2.6小结 52
第3章 指针和函数 53
3.1程序的栈和堆 53
3.1.1程序栈 54
3.1.2栈帧的组织 55
3.2通过指针传递和返回数据 57
3.2.1用指针传递数据 57
3.2.2用值传递数据 58
3.2.3传递指向常量的指针 59
3.2.4返回指针 60
3.2.5局部数据指针 61
3.2.6传递空指针 62
3.2.7传递指针的指针 63
3.3函数指针 66
3.3.1声明函数指针 66
3.3.2使用函数指针 67
3.3.3传递函数指针 69
3.3.4返回函数指针 69
3.3.5使用函数指针数组 70
3.3.6比较函数指针 71
3.3.7转换函数指针 71
3.4小结 72
第4章 指针和数组 75
4.1数组概述 76
4.1.1一维数组 76
4.1.2二维数组 77
4.1.3多维数组 78
4.2指针表示法和数组 78
4.3用malloc创建一维数组 81
4.4用realloc调整数组长度 82
4.5传递一维数组 85
4.5.1用数组表示法 85
4.5.2用指针表示法 86
4.6使用指针的一维数组 87
4.7指针和多维数组 89
4.8传递多维数组 91
4.9动态分配二维数组 94
4.9.1分配可能不连续的内存 94
4.9.2分配连续内存 95
4.10不规则数组和指针 96
4.11小结 99
第5章 指针和字符串 101
5.1字符串基础 101
5.1.1字符串声明 102
5.1.2字符串字面量池 103
5.1.3字符串初始化 104
5.2标准字符串操作 108
5.2.1比较字符串 108
5.2.2复制字符串 109
5.2.3拼接字符串 111
5.3传递字符串 114
5.3.1传递简单字符串 114
5.3.2传递字符常量的指针 116
5.3.3传递需要初始化的字符串 116
5.3.4给应用程序传递参数 118
5.4返回字符串 119
5.4.1返回字面量的地址 119
5.4.2返回动态分配内存的地址 120
5.5函数指针和字符串 122
5.6小结 124
第6章 指针和结构体 125
6.1介绍 125
6.2结构体释放问题 128
6.3避免malloc/free开销 131
6.4用指针支持数据结构 133
6.4.1单链表 134
6.4.2用指针支持队列 141
6.4.3用指针支持栈 143
6.4.4用指针支持树 145
6.5小结 148
第7章 安全问题和指针误用 149
7.1指针的声明和初始化 150
7.1.1不恰当的指针声明 150
7.1.2使用指针前未初始化 151
7.1.3处理未初始化指针 151
7.2指针的使用问题 152
7.2.1测试NULL 153
7.2.2错误使用解引操作 153
7.2.3迷途指针 154
7.2.4越过数组边界访问内存 154
7.2.5错误计算数组长度 155
7.2.6错误使用sizeof操作符 156
7.2.7一定要匹配指针类型 156
7.2.8有界指针 157
7.2.9字符串的安全问题 157
7.2.10指针算术运算和结构体 158
7.2.11函数指针的问题 160
7.3内存释放问题 161
7.3.1重复释放 162
7.3.2清除敏感数据 162
7.4使用静态分析工具 163
7.5小结 164
第8章 其他重要内容 165
8.1转换指针 166
8.1.1访问特殊用途的地址 167
8.1.2访问端口 168
8.1.3用DMA访问内存 169
8.1.4判断机器的字节序 169
8.2别名、强别名和restrict关键字 170
8.2.1用联合体以多种方式表示值 171
8.2.2强别名 172
8.2.3使用restrict关键字 173
8.3线程和指针 174
8.3.1线程间共享指针 175
8.3.2用函数指针支持回调 177
8.4面向对象技术 179
8.4.1创建和使用不透明指针 179
8.4.2 C中的多态 182
8.5小结 187
关于作者和封面 188