C语言是编程语言中的一朵奇葩,虽已垂垂老矣,但却屹立不倒,诞生了数十年,仍然是最流行的编程语言之一。C语言看似简单,却不易吃透,想要运用好,更是需要积淀。本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,旨在让读者真正掌握C语言,从而编写出更高质量的C程序代码。
全书一共11章:第1章重点阐述了C语言中不易被理解的多个核心概念,很多初学者在理解这些概念时都会存在误区;第2-8章对预处理、选择结构和循环结构的程序设计、数组、指针、数据结构、函数和文件等知识点的核心问题和注意事项进行了讲解;第9章介绍了调试和异常处理的方法及注意事项;第10章对C语言中的若干容易让开发者误解误用的陷阱知识点进行了剖析;第11章则对所有程序员必须掌握的几种算法进行了详细的讲解。
封面图
目录
- 前言
- 第1章必须厘清的核心概念/1
- 1.1堆栈/2
- 1.2全局变量和局部变量/5
- 1.3生存期和作用域/7
- 1.3.1生存期/7
- 1.3.2作用域/10
- 1.4内部函数和外部函数/11
- 1.5指针变量/14
- 1.6指针数组和数组指针/17
- 1.7指针函数和函数指针/20
- 1.8传值和传址/22
- 1.9递归和嵌套/25
- 1.10结构体/29
- 1.11共用体/32
- 1.12枚举/37
- 1.13位域/39
- 第2章预处理/47
- 2.1文件的包含方式/48
- 2.2宏定义/50
- 2.2.1简单宏替换/50
- 2.2.2带参数的宏替换/52
- 2.2.3嵌套宏替换/56
- 2.3宏定义常见错误解析/56
- 2.3.1不带参数的宏/56
- 2.3.2带参数的宏/59
- 2.4条件编译指令的使用/62
- 2.5#pragma指令的使用/65
- 第3章选择结构和循环结构的程序设计/69
- 3.1if语句及其易错点解析/70
- 3.2条件表达式的使用/76
- 3.3switch语句的使用及注意事项/78
- 3.4goto语句的使用及注意事项/85
- 3.5for语句的使用及注意事项/87
- 3.6while循环与do while循环的使用及区别/92
- 3.7循环结构中break、continue、goto、return和exit的区别/98
- 第4章数组/103
- 4.1一维数组的定义及引用/104
- 4.2二维数组的定义及引用/110
- 4.3多维数组的定义及引用/117
- 4.4字符数组的定义及引用/119
- 4.5数组作为函数参数的易错点解析/124
- 4.6动态数组的创建及引用/130
- 第5章指针/139
- 5.1不同类型指针之间的区别和联系 /140
- 5.2指针的一般性用法及注意事项/144
- 5.3指针与地址之间的关系/148
- 5.4指针与数组之间的关系/153
- 5.5指针与字符串之间的关系/161
- 5.6指针与函数之间的关系/163
- 5.7指针与指针之间的关系/169
- 第6章数据结构/172
- 6.1枚举类型的使用及注意事项/173
- 6.2结构体变量的初始化方法及引用/177
- 6.2.1结构体的初始化/177
- 6.2.2结构体的引用/180
- 6.3结构体字节对齐详解/184
- 6.4共用体变量的初始化方法及成员的引用/193
- 6.5传统链表的实现方法及注意事项/196
- 6.6颠覆传统链表的实现方法/214
- 6.6.1头结点的创建/214
- 6.6.2结点的添加/215
- 6.6.3结点的删除/217
- 6.6.4结点位置的调整/219
- 6.6.5检测链表是否为空/221
- 6.6.6链表的合成/222
- 6.6.7宿主结构指针/225
- 6.6.8链表的遍历/225
- 第7章函数/230
- 7.1函数参数/231
- 7.2变参函数的实现方法/235
- 7.3函数指针的使用方法/241
- 7.4函数之间的调用关系/245
- 7.5函数的调用方式及返回值/251
- 第8章文件/255
- 8.1文件及文件指针/256
- 8.2EOF和FEOF的区别/259
- 8.3读写函数的选用原则/264
- 8.4位置指针对文件的定位/270
- 8.5文件中的出错检测/275
- 第9章调试和异常处理/279
- 9.1assert宏的使用及注意事项/280
- 9.2如何设计一种灵活的断言/283
- 9.3如何实现异常处理/287
- 9.4如何处理段错误/293
- 第10章陷阱知识点解剖/299
- 10.1strlen和sizeof的区别/300
- 10.2const修饰符/301
- 10.3volatile修饰符/305
- 10.4void和void*的区别/311
- 10.5#define和typedef的本质区别/314
- 10.6条件语句的选用/317
- 10.7函数realloc、malloc和calloc的区别/319
- 10.8函数和宏/322
- 10.9运算符==、=和!=的区别/323
- 10.10类型转换/324
- 第11章必须掌握的常用算法/326
- 11.1时间复杂度/327
- 11.2冒泡法排序/329
- 11.3选择法排序/332
- 11.4快速排序/334
- 11.5归并排序/337
- 11.6顺序查找/340
- 11.7二分查找/341
- 附录如何养成良好的编程习惯/344