- 动手能力薄弱:针对大学应试教学下编程实践不足的问题,通过大量实例与调试练习,帮助读者真正写出能跑的代码。
- 程序执行原理不清:深入解析编译过程、内存布局、指针与栈空间,让读者理解代码背后的运行机制。
- 面试与考研备考无方向:精选互联网公司校招/社招面试题与高校考研机试真题,提供可靠的练习指导。
- 数据结构与算法基础不牢:结合C语言讲解数组、指针、结构体等,为后续学习Linux系统编程和C++打下基础。
- 缺乏系统练习环境:每章配套教学视频、实例代码和课后习题代码,读者可按建议下载并动手实践。
★★★
中级
入门初级中级进阶高级
- C语言初学者:从零开始系统学习C语言,配合视频和代码快速上手。
- 考研备考学生:需要针对高校研究生机试进行专项训练和真题练习。
- 校招求职者:准备互联网公司在线笔试和面试,需要刷题与原理讲解。
- 转行程序员:希望夯实编程基础,为学习Linux或C++做准备。
- 按章节顺序阅读:从环境搭建开始,逐章推进,不要跳过基础章节。
- 动手敲代码:每章实例和课后习题务必亲自编写并调试,不要只看不练。
- 重点攻克指针章节:第5、6章是指针核心,建议反复阅读并配合画图理解内存。
- 利用配套视频:遇到难点时观看教学视频,加深对程序执行过程的理解。
- 刷真题检验:学完基础后集中练习面试题和机试真题,查漏补缺。
- 扎实的C语言功底:掌握数据类型、指针、数组、函数、结构体等核心语法并能熟练运用。
- 程序调试能力:学会设置断点、单步调试,能够独立定位和修复代码错误。
- 底层原理理解:理解编译过程、内存布局、栈空间和指针偏移等底层机制。
- 面试与考研竞争力:通过真题训练,具备应对校招笔试和研究生机试的实战能力。
- 后续学习基础:为深入学习Linux系统编程、C++和数据结构算法铺平道路。
📖 书籍简介
内容简介
越来越多的高校在录取研究生时开始采用上机考试的形式来考查学生的动手编程能力,很多知名互联网公司在校招时也采用在线笔试的形式,然而,在以应试为主的大学教学模式下,动手能力往往是学生的薄弱环节。为此,本书以C语言为工具,由浅入深、由易到难地讲解了C语言,深入解析了程序执行的原理及数据结构和算法,为读者后续学习Linux系统编程和C++语言编程打下坚实的基础;同时,书中精选了各大知名互联网公司的校招面试题和社招面试题,以及部分知名高校考研的机试真题,可为读者提供可靠、实际的练习指导。全书强调程序的编写与调试,内容精练,可操作性强。每章均提供教学视频、实例代码和课后习题代码,读者可按书中的建议下载并练习。本书不仅可以作为读者提升C语言编程能力的图书,而且可以作为研究生初试的复习用书,还可作为C语言初学者的参考用书。
作者简介
李志龙,中南大学自动化学士,毕业后曾供职于金蝶、华为、OPPO等企业。2015年加入王道训练营,从事C/Linux/C++/Java EE/Python程序设计的教学工作。由于教学出色,加之培训视频圆了许多学子成功就业或读研的梦想,逐步被大家称为“龙哥”。
目录
目 录
第1章 开发环境搭建及调试窗口设置1
1.1 开发环境搭建1
1.1.1 C语言的那些事1
1.1.2 开发环境安装3
1.2 新建项目7
1.3 新建代码及编译运行9
1.4 程序的编译过程13
1.5 断点及调试窗口设置14
1.6 学习C语言后的境界16
练习题17
第2章 数据类型、运算符与表达式18
2.1 数据类型18
2.2 常量19
2.3 变量19
2.4 整型数据19
2.4.1 符号常量19
2.4.2 整型常量的不同进制表示22
2.4.3 补码的作用25
2.4.4 整型变量27
2.5 浮点型数据28
2.5.1 浮点型常量28
2.5.2 浮点型变量28
2.6 字符型数据30
2.6.1 字符型常量30
2.6.2 字符数据在内存中的存储形式及其使用方法31
2.7 字符串型常量32
2.8 混合运算32
2.8.1 数值按int型运算32
2.8.2 浮点型常量默认按double型运算34
2.8.3 类型强制转换场景35
2.9 常用的数据输入/输出函数36
2.9.1 scanf函数的原理36
2.9.2 scanf函数的循环读取38
2.9.3 多种数据类型混合输入39
2.9.4 getchar函数介绍40
2.9.5 putchar函数介绍41
2.9.6 printf函数介绍42
2.10 运算符与表达式43
2.10.1 运算符分类43
2.10.2 算术运算符及算术表达式44
2.10.3 关系运算符与关系表达式45
2.10.4 逻辑运算符与逻辑表达式47
2.10.5 位运算符48
2.10.6 赋值运算符49
2.10.7 条件运算符与逗号运算符51
2.10.8 自增、自减运算符及求字节运算符51
练习题52
答案解析52
第3章 选择与循环60
3.1 选择结构程序设计60
3.1.1 关系表达式与逻辑表达式60
3.1.2 if语句60
3.1.3 switch语句62
3.2 循环结构程序设计64
3.2.1 goto语句64
3.2.2 while循环65
3.2.3 do while循环66
3.2.4 for循环67
3.2.5 continue语句68
3.2.6 break语句69
练习题69
答案解析70
第4章 数组83
4.1 一维数组83
4.1.1 数组的定义83
4.1.2 一维数组在内存中的存储84
4.1.3 栈空间和数组87
4.2 二维数组88
4.2.1 二维数组的定义与引用88
4.2.2 二维数组的初始化及传递89
4.3 字符数组91
4.3.1 字符数组的定义及初始化91
4.3.2 gets函数与puts函数93
4.3.3 str系列字符串操作函数93
4.3.4 strn系列字符串操作函数95
4.3.5 mem系列操作函数96
练习题97
答案解析98
第5章 指针106
5.1 指针的本质106
5.1.1 指针的定义106
5.1.2 取地址操作符与取值操作符107
5.2 指针的使用场景108
5.2.1 指针的传递108
5.2.2 指针的偏移110
5.2.3 指针与自增、自减运算符112
5.2.4 指针与一维数组113
5.2.5 指针与动态内存申请113
5.2.6 字符指针与字符数组的初始化117
5.2.7 深入理解const118
5.2.8 memcpy函数与memmove函数的差异119
5.3 数组指针与二维数组120
5.3.1 数组指针的应用120
5.3.2 二维数组的偏移计算122
5.4 二级指针122
5.4.1 二级指针的传递122
5.4.2 二级指针的偏移123
5.5 函数指针125
练习题126
答案解析126
第6章 函数133
6.1 函数的声明、定义与调用133
6.1.1 函数的声明与定义133
6.1.2 函数的分类与调用135
6.2 嵌套调用137
6.3 递归调用138
6.4 变量及函数的作用域140
6.4.1 局部变量与全局变量140
6.4.2 动态存储方式与静态存储方式142
6.5 函数调用原理详解144
6.5.1 关于栈144
6.5.2 代码实例分析145
练习题146
答案解析147
第7章 结构体149
7.1 结构体与结构体指针149
7.1.1 结构体的定义、引用、初始化149
7.1.2 结构体指针151
7.1.3 typedef的使用152
7.2 链表的增删查改152
7.2.1 链表152
7.2.2 增删查改链表153
7.3 共用体与枚举158
7.3.1 共用体158
7.3.2 枚举159
练习题159
答案解析160
第8章 常用数据结构与算法182
8.1 数据结构182
8.1.1 栈182
8.1.2 队列184
8.1.3 二叉树187
8.1.4 红黑树192
8.1.5 数据结构学习技巧209
8.2 算法209
8.2.1 时间复杂度与空间复杂度209
8.2.2 排序算法210
8.2.3 二分查找算法235
8.2.4 哈希查找算法236
8.2.5 其他算法239
练习题239
答案解析239
第9章 文件操作243
9.1 C文件概述243
9.2 文件的打开、读写、关闭244
9.2.1 文件指针介绍244
9.2.2 文件的打开与关闭244
9.2.3 fread函数与fwrite函数247
9.2.4 fgets函数与fputs函数249
9.2.5 ftell函数251
9.2.6 fprintf函数与fscanf函数252
练习题253
答案解析253
第10章 C语言预处理和C语言库260
10.1 预处理简介260
10.2 预处理的工作原理260
10.3 预处理指令262
10.4 宏定义263
10.4.1 简单的宏263
10.4.2 带参数的宏265
10.4.3 操作符#267
10.4.4 操作符##267
10.4.5 宏的通用属性268
10.4.6 较长的宏中的逗号操作符269
10.4.7 宏定义中的do while循环270
10.4.8 预定义宏270
10.4.9 空宏参数271
10.4.10 const与#define的差异272
10.5 条件编译273
10.5.1 #if指令和#endif指令273
10.5.2 defined操作符273
10.5.3 #ifdef指令和#ifndef指令274
10.5.4 #elif指令和#else指令275
10.5.5 条件编译276
10.6 其他指令277
10.6.1 指令#line277
10.6.2 指令#undef278
10.6.3 变参宏...和__VA_ARGS__278
10.7 内联函数(C99)279
10.8 C库中的可变参数stdarg.h280
练习题282
答案解析283
第11章 学生信息管理系统285
11.1 系统功能描述285
11.2 系统模块设计286
11.3 系统用到的相关函数288
第12章 编译器词法、语法分析项目290
12.1 词法分析项目290
12.1.1 项目需求描述290
12.2 词法分析模块设计290
12.2.1 建立字典模块290
12.2.2 字符串存储及其TOKEN值的快速识别设计293
12.3 词法及语法分析简单样例研究296
12.3.1 算术表达式的合法性判断296
12.3.2 词法分析296
12.3.3 算术表达式的语法分析299
12.4 升级版功能:编译器语法分析303
12.4.1 整体流程分析304
12.4.2 函数体内流程分析305
12.4.3 表达式解析流程分析306
12.4.4 总结307
附录A ASCII码表308
附录B C语言运算符优先级311
参考文献313
第1章 开发环境搭建及调试窗口设置1
1.1 开发环境搭建1
1.1.1 C语言的那些事1
1.1.2 开发环境安装3
1.2 新建项目7
1.3 新建代码及编译运行9
1.4 程序的编译过程13
1.5 断点及调试窗口设置14
1.6 学习C语言后的境界16
练习题17
第2章 数据类型、运算符与表达式18
2.1 数据类型18
2.2 常量19
2.3 变量19
2.4 整型数据19
2.4.1 符号常量19
2.4.2 整型常量的不同进制表示22
2.4.3 补码的作用25
2.4.4 整型变量27
2.5 浮点型数据28
2.5.1 浮点型常量28
2.5.2 浮点型变量28
2.6 字符型数据30
2.6.1 字符型常量30
2.6.2 字符数据在内存中的存储形式及其使用方法31
2.7 字符串型常量32
2.8 混合运算32
2.8.1 数值按int型运算32
2.8.2 浮点型常量默认按double型运算34
2.8.3 类型强制转换场景35
2.9 常用的数据输入/输出函数36
2.9.1 scanf函数的原理36
2.9.2 scanf函数的循环读取38
2.9.3 多种数据类型混合输入39
2.9.4 getchar函数介绍40
2.9.5 putchar函数介绍41
2.9.6 printf函数介绍42
2.10 运算符与表达式43
2.10.1 运算符分类43
2.10.2 算术运算符及算术表达式44
2.10.3 关系运算符与关系表达式45
2.10.4 逻辑运算符与逻辑表达式47
2.10.5 位运算符48
2.10.6 赋值运算符49
2.10.7 条件运算符与逗号运算符51
2.10.8 自增、自减运算符及求字节运算符51
练习题52
答案解析52
第3章 选择与循环60
3.1 选择结构程序设计60
3.1.1 关系表达式与逻辑表达式60
3.1.2 if语句60
3.1.3 switch语句62
3.2 循环结构程序设计64
3.2.1 goto语句64
3.2.2 while循环65
3.2.3 do while循环66
3.2.4 for循环67
3.2.5 continue语句68
3.2.6 break语句69
练习题69
答案解析70
第4章 数组83
4.1 一维数组83
4.1.1 数组的定义83
4.1.2 一维数组在内存中的存储84
4.1.3 栈空间和数组87
4.2 二维数组88
4.2.1 二维数组的定义与引用88
4.2.2 二维数组的初始化及传递89
4.3 字符数组91
4.3.1 字符数组的定义及初始化91
4.3.2 gets函数与puts函数93
4.3.3 str系列字符串操作函数93
4.3.4 strn系列字符串操作函数95
4.3.5 mem系列操作函数96
练习题97
答案解析98
第5章 指针106
5.1 指针的本质106
5.1.1 指针的定义106
5.1.2 取地址操作符与取值操作符107
5.2 指针的使用场景108
5.2.1 指针的传递108
5.2.2 指针的偏移110
5.2.3 指针与自增、自减运算符112
5.2.4 指针与一维数组113
5.2.5 指针与动态内存申请113
5.2.6 字符指针与字符数组的初始化117
5.2.7 深入理解const118
5.2.8 memcpy函数与memmove函数的差异119
5.3 数组指针与二维数组120
5.3.1 数组指针的应用120
5.3.2 二维数组的偏移计算122
5.4 二级指针122
5.4.1 二级指针的传递122
5.4.2 二级指针的偏移123
5.5 函数指针125
练习题126
答案解析126
第6章 函数133
6.1 函数的声明、定义与调用133
6.1.1 函数的声明与定义133
6.1.2 函数的分类与调用135
6.2 嵌套调用137
6.3 递归调用138
6.4 变量及函数的作用域140
6.4.1 局部变量与全局变量140
6.4.2 动态存储方式与静态存储方式142
6.5 函数调用原理详解144
6.5.1 关于栈144
6.5.2 代码实例分析145
练习题146
答案解析147
第7章 结构体149
7.1 结构体与结构体指针149
7.1.1 结构体的定义、引用、初始化149
7.1.2 结构体指针151
7.1.3 typedef的使用152
7.2 链表的增删查改152
7.2.1 链表152
7.2.2 增删查改链表153
7.3 共用体与枚举158
7.3.1 共用体158
7.3.2 枚举159
练习题159
答案解析160
第8章 常用数据结构与算法182
8.1 数据结构182
8.1.1 栈182
8.1.2 队列184
8.1.3 二叉树187
8.1.4 红黑树192
8.1.5 数据结构学习技巧209
8.2 算法209
8.2.1 时间复杂度与空间复杂度209
8.2.2 排序算法210
8.2.3 二分查找算法235
8.2.4 哈希查找算法236
8.2.5 其他算法239
练习题239
答案解析239
第9章 文件操作243
9.1 C文件概述243
9.2 文件的打开、读写、关闭244
9.2.1 文件指针介绍244
9.2.2 文件的打开与关闭244
9.2.3 fread函数与fwrite函数247
9.2.4 fgets函数与fputs函数249
9.2.5 ftell函数251
9.2.6 fprintf函数与fscanf函数252
练习题253
答案解析253
第10章 C语言预处理和C语言库260
10.1 预处理简介260
10.2 预处理的工作原理260
10.3 预处理指令262
10.4 宏定义263
10.4.1 简单的宏263
10.4.2 带参数的宏265
10.4.3 操作符#267
10.4.4 操作符##267
10.4.5 宏的通用属性268
10.4.6 较长的宏中的逗号操作符269
10.4.7 宏定义中的do while循环270
10.4.8 预定义宏270
10.4.9 空宏参数271
10.4.10 const与#define的差异272
10.5 条件编译273
10.5.1 #if指令和#endif指令273
10.5.2 defined操作符273
10.5.3 #ifdef指令和#ifndef指令274
10.5.4 #elif指令和#else指令275
10.5.5 条件编译276
10.6 其他指令277
10.6.1 指令#line277
10.6.2 指令#undef278
10.6.3 变参宏...和__VA_ARGS__278
10.7 内联函数(C99)279
10.8 C库中的可变参数stdarg.h280
练习题282
答案解析283
第11章 学生信息管理系统285
11.1 系统功能描述285
11.2 系统模块设计286
11.3 系统用到的相关函数288
第12章 编译器词法、语法分析项目290
12.1 词法分析项目290
12.1.1 项目需求描述290
12.2 词法分析模块设计290
12.2.1 建立字典模块290
12.2.2 字符串存储及其TOKEN值的快速识别设计293
12.3 词法及语法分析简单样例研究296
12.3.1 算术表达式的合法性判断296
12.3.2 词法分析296
12.3.3 算术表达式的语法分析299
12.4 升级版功能:编译器语法分析303
12.4.1 整体流程分析304
12.4.2 函数体内流程分析305
12.4.3 表达式解析流程分析306
12.4.4 总结307
附录A ASCII码表308
附录B C语言运算符优先级311
参考文献313
📑 章节目录
- 开发环境搭建及调试窗口设置
- 数据类型、运算符与表达式
- 选择与循环结构程序设计
- 数组:一维、二维与字符数组
- 指针的本质与使用场景
- 数组指针与二维数组的偏移计算
- 函数定义、调用与参数传递
- 结构体、共用体与枚举
- 文件操作与预处理命令
- 数据结构与算法基础实践
- 校招面试题与考研机试真题精讲
- 综合项目实战与调试技巧