征服C指针 第2版 作者:[日]前桥和弥 出版时间:2021年版内容简介 本书以C语言中的重难点“指针”为主题,提供了程序员所需的深入而完整的指针知识。作者结合多年的编程经验和感悟,从C指针的概念讲起,通过实验一步一步地揭示了指针和数组、内存、数据结构的关系,展现了指针的常见用法,揭示了各种使用技巧,还通过独特的方式告诉读者怎样解读C语言那些让人“纠结”的声明语法,以及如何绕过C指针的陷阱等。第2版基于64位操作系统对内容进行了大幅修订,新增了对ISO-C99、C11标准下相关内容的介绍等。本书非常适合C语言中级学习者阅读,也可作为计算机专业学生学习C语言的参考。目录第0章本书目标与读者对象 10-1 本书目标 20-2 读者对象与内容结构 5第 1章打好基础——预备知识和复习 91-1 C语言是什么样的语言 101-1-1 C语言的发展历程 10是汇编语言还是汇编器 11B语言是什么样的语言 121-1-2 不完备和不统一的语法 131-1-3 C语言“圣经”——K&R 131-1-4 ANSI C之前的C语言 141-1-5 ANSI C(C89/90) 161-1-6 C95 161-1-7 C99 171-1-8 C11 181-1-9 C语言的理念 191-1-10 C语言的主体 201-1-11 C语言曾是只能使用标量的语言 211-2 内存和地址 231-2-1 内存和地址 231-2-2 内存和变量 25size_t类型 271-2-3 内存和程序运行 271-3 关于指针 291-3-1 恶名昭著的指针究竟是什么 291-3-2 和指针的第 一次亲密接触 301-3-3 地址运算符、间接运算符、下标运算符 34关于本书中的地址值——16进制表示法 35混乱的声明——如何自然地理解声明 35杂谈:hoge是什么 371-3-4 指针和地址之间的微妙关系 38在运行时既没有类型信息,也没有变量名 401-3-5 指针运算 411-3-6 何谓空指针 42NULL和0和'//0' 431-3-7 实践——从函数返回多个值 46形参与实参 501-4 关于数组 511-4-1 使用数组 51C语言的数组是从0开始的 531-4-2 数组与指针的微妙关系 541-4-3 下标运算符[]与数组毫无关系 56语法糖 591-4-4 为何存在指针运算这种奇怪功能 591-4-5 别再滥用指针运算了 61更改参数的做法可取吗 621-4-6 试图将数组作为函数参数传递 63如果对数组进行值传递 651-4-7 声明函数形参的方法 66C语言为什么不进行数组边界检查 671-4-8 C99中的可变长数组 68第 2章做个实验——C语言是怎样使用内存的 712-1 虚拟地址 72关于scanf() 75未定义、未指定、实现定义 772-2 C语言中内存的使用方法 782-2-1 C语言中变量的种类 782-2-2 尝试输出地址 80存储类说明符 802-3 函数与字符串字面量 852-3-1 只读内存区域 852-3-2 指向函数的指针 862-4 静态变量 882-4-1 什么是静态变量 882-4-2 分割编译与链接 882-5 自动变量(栈) 912-5-1 内存空间的“重复使用” 912-5-2 函数调用究竟发生了什么 91调用约定 952-5-3 自动变量的引用 95一旦函数执行结束,自动变量的内存空间就会被释放 982-5-4 典型的安全漏洞——缓冲区溢出漏洞 99操作系统针对缓冲区溢出漏洞给出的对策 1022-5-5 可变长参数 103assert() 106试写一个用于调试的函数 1072-5-6 递归调用 1102-5-7 C99中的可变长数组(VLA)的栈 1132-6 利用malloc()动态分配内存(堆) 1162-6-1 malloc()的基础知识 116应该强制转换malloc()的返回值类型吗 1192-6-2 malloc()是系统调用吗 1192-6-3 malloc()中发生了什么 1202-6-4 free()之后相应的内存空间会怎样 122Valgrind 1242-6-5 碎片化 1242-6-6 malloc()以外的动态内存分配函数 125假如malloc()参数为0 127malloc()的返回值检查 128程序结束时也必须调用free()吗 1292-7 对齐 131结构体的成员名称在运行时也是缺失的 1342-8 字节序 1352-9 关于语言规范和实现——抱歉,前面的内容都是骗你的 137第3章语法揭秘——它到底是怎么回事 1393-1 解读C语言声明 1403-1-1 用英语阅读 1403-1-2 解读C语言声明 141近来的语言多数是将类型后置的 1443-1-3 类型名 145如果把间接运算符*后置 1463-2 C语言数据类型的模型 1473-2-1 基本类型和派生类型 1473-2-2 指针类型的派生 1483-2-3 数组类型的派生 1503-2-4 什么是指向数组的指针 1503-2-5 C语言中不存在多维数组 1523-2-6 函数类型的派生 1543-2-7 计算类型的长度 1553-2-8 基本类型 1573-2-9 结构体和联合体 1593-2-10 不完全类型 1593-3 表达式 1623-3-1 表达式和数据类型 162对“表达式”使用sizeof 1643-3-2 什么是左值——变量的两张面孔 166“左值”的由来 1673-3-3 数组→指针的转换 1683-3-4 与数组和指针相关的运算符 1693-3-5 多维数组 171运算符的优先级 1733-4 解读C语言声明(续) 1763-4-1 const修饰符 1763-4-2 如何使用const?可以用到哪种程度 178const可以代替#define吗 1813-4-3 typedef 1813-5 其他 1853-5-1 函数形参的声明(ANSI C版) 185K&R中关于函数形参声明的说明 1863-5-2 函数形参的声明(C99版) 1883-5-3 关于空的下标运算符[] 189定义与声明 1913-5-4 字符串字面量 192字符串字面量是char的数组 1943-5-5 关于指向函数的指针引发的混乱 1953-5-6 强制类型转换 1963-5-7 练习——解读复杂声明 1983-6 请记住:数组与指针截然不同 2033-6-1 你为什么感到混乱 2033-6-2 在表达式中 2043-6-3 在声明中 206第4章数组和指针的常见用法 2094-1 基本用法 2104-1-1 通过返回值以外的方法返回 2104-1-2 将数组作为函数的参数传递 2114-1-3 动态数组——通过malloc()分配的可变长数组 212其他语言的数组 2144-2 组合使用 2164-2-1 动态数组的数组 216宽字符 2234-2-2 动态数组的动态数组 2254-2-3 命令行参数 2284-2-4 通过参数返回指针 230什么是“双指针” 2354-2-5 将多维数组作为函数的参数传递 2364-2-6 将多维数组作为函数的参数传递(VLA版) 2374-2-7 通过malloc()分配纵横可变的二维数组(C99) 239C语言中的多维数组是行优先的 240纵横可变的二维数组的ANSI C实现 241Java和C#的多维数组 2424-2-8 数组的动态数组 2434-2-9 在考虑可变之前,不妨考虑使用结构体 2444-2-10 可变长结构体(ANSI C版) 246关于分配可变长结构体时的长度指定 2484-2-11 柔性数组成员(C99) 248指针可以指向数组的最后一个元素的下一个元素 249第5章数据结构——指针的真正用法 2515-1 案例学习1:计算单词的使用频率 2525-1-1 案例的需求 252各种语言中指针的叫法 253引用传递 2535-1-2 设计 256关于头文件的写法 2595-1-3 数组版 2615-1-4 链表版 265头文件的公有和私有 271当需要同时处理多个数据时 272迭代器 2735-1-5 添加查找功能 275翻倍游戏 2775-1-6 其他数据结构 2775-2 案例学习2:绘图工具的数据结构 2835-2-1 案例的需求 2835-2-2 表示各种图形 284关于坐标系 2855-2-3 Shape类型 2865-2-4 讨论——还有其他方法吗 289能保存任何类型的链表 2935-2-5 图形的组合 2945-2-6 通过指向函数的指针的数组分配处理 3005-2-7 通往继承与多态之路 302将draw()放入Shape中真的好吗 3025-2-8 指针的可怕之处 3045-2-9 那么,指针到底是什么呢 305第6章其他——拾遗 3076-1 新的函数组 3086-1-1 添加了范围检查的函数(C11) 308restrict关键字 3106-1-2 无须使用静态存储空间的函数(C11) 3116-2 陷阱 3146-2-1 整数提升 3146-2-2 如果在(老式的)C语言中使用float类型的参数 3166-2-3 printf()与scanf() 3186-2-4 原型声明的光与影 3196-3 惯用写法 3216-3-1 结构体声明 3216-3-2 自引用结构体 3226-3-3 结构体的相互引用 3236-3-4 结构体的嵌套 3246-3-5 联合体 3256-3-6 无名结构体和无名联合体(C11) 3266-3-7 数组的初始化 3276-3-8 指向char的指针的数组的初始化 3286-3-9 结构体的初始化 3296-3-10 联合体的初始化 3306-3-11 指定初始化(C99) 3316-3-12 复合字面量(C99) 332参考文献 334 上一篇: Python绘图指南:分形与数据可视化 胡洁 2021年版 下一篇: 微服务架构原理与开发实战 张刚 2021年版