C 语言知识点大纲(参考《C primer plus》)
目录
C 语言知识点大纲(参考《C primer plus》)
1 第1章 初识 C语言
1.1 C语言的起源
1.2 选择C语言的理由
- 设计特性
- 高效性
- 可移植性
- 强大而灵活
- 面向程序员
- 缺点
1.3 C语言的应用范围
1.4 计算机能做什么
1.5 高级计算机语言和编译器
1.6 语言标准
- 第1个ANSI/ISO C标准
- C99标准
- C11标准
1.7 使用C语言的7个步骤
- 第1步:定义程序的目标
- 第2步:设计程序 7
- 第3步:编写代码
- 第4步:编译
- 第5步:运行程序
- 第6步:测试和调试程序
- 第7步:维护和修改代码
- 说明
1.8 编程机制
- 目标代码文件、可执行文件和库
- UNIX系统
- GNU编译器集合和 LLVM项目
- Linux系统
- PC的命令行编译器
- 集成开发环境(Windows)
- Windows/Linux
- Macintosh中的C
2 第2章 C语言概述
2.1 简单的C程序示例
2.2 提高程序可读性的技巧
2.3 进一步使用C
- 程序说明
- 多条声明
- 打印多个值
2.4 多个函数
2.5 调试程序
- 语法错误
- 语义错误
- 程序状态
2.6 关键字和保留标识符
3 第3章 数据和C
3.1 变量与常量数据
3.2 数据:数据类型关键字
- 整数
- 浮点数
3.3 C语言基本数据类型
- int类型
- 其他整数类型
- 使用字符:char类型
- _Bool类型
- 可移植类型: stdint.h和inttypes.h
- float、double和long double
- 复数和虚数类型
- 其他类型
- 类型大小
3.4 使用数据类型
3.5 参数和陷阱
3.6 转义序列示例
- 程序运行情况
- 刷新输出
4 第4章 字符串和格式化输入/输出
4.1 字符串简介
- char类型数组和null字符
- 使用字符串
- strlen()函数
4.2 常量和C预处理器
- 明示常量
- const限定符
4.3 printf()和scanf()
- printf()函数
- 使用printf()
- printf()的转换说明修饰符
- 转换说明的意义
- 使用scanf()
- printf()和scanf()的修饰符
- printf() 的用法提
5 第5章 运算符、表达式和语句
5.1 循环简介
5.2 基本运算符
- 赋值运算符:=
- 加法运算符:+
- 减法运算符:-
- 符号运算符:-和+
- 乘法运算符:*
- 除法运算符:/
- 运算符优先级
- 优先级和求值顺序
5.3 其他运算符
- sizeof运算符和size_t类型
- 求模运算符:%
- 递增运算符:++
- 递减运算符:–
- 优先级
5.4 表达式和语句
- 表达式
- 语句
- 复合语句(块)
5.5 类型转换
5.6 带参数的函数
6 第6章 C控制语句:循环
6.1 再探while循环
- 程序注释
- C风格读取循环
6.2 while语句
- 终止while循环
- 何时终止循环
- while:入口条件循环
- 语法要点
6.3 用关系运算符和表达式比较大小
- 什么是真
- 其他真值
- 真值的问题
- 新的_Bool类型
- 优先级和关系运算
6.4 不确定循环和计数循环
6.5 for循环
6.6 其他赋值运算符:+=、-=、*=、/=、%=
6.7 逗号运算符
6.8 出口条件循环:do while
6.9 如何选择循环
6.10 嵌套循环
- 程序分析
- 嵌套变式
6.11 数组简介
6.12 使用函数返回值的循环示例
7 第7章 C控制语句:分支和跳转
7.1 if语句
7.2 if else语句
- ctype.h系列的字符函数
- 多重选择else if
- else与if配对
- 多层嵌套的if语句
7.3 逻辑运算符
- 优先级
- 求值顺序
- 范围
7.4 一个统计单词的程序
7.5 条件运算符:?:
7.6 循环辅助:continue和break
- continue语句
- break语句
7.7 多重选择:switch和break
- switch语句
- 只读每行的首字符
- 多重标签
- switch和if els
7.8 goto语句
8 第8章 字符输入/输出和输入验证
8.1 单字符I/O:getchar()和putchar()
8.2 缓冲区
8.3 结束键盘输入
- 文件、流和键盘输入
- 文件结尾
8.4 重定向和文件
8.5 创建更友好的用户界面
- 使用缓冲输入
- 混合数值和字符输入
8.6 输入验证
- 分析程序
- 输入流和数字
8.7 混合字符和数值输入
9 第9章 函数
9.1 初识函数
- 创建并使用简单函数
- 分析程序
- 函数参数
- 定义带形式参数的函数
- 声明带形式参数函数的原型
- 调用带实际参数的函数
- 黑盒视角
- 使用return从函数中返回值
- 函数类型
9.2 ANSI C函数原型
- 问题所在
- ANSI的解决方案
- 无参数和未指定参数
- 函数原型的优点
9.3 递归
- 演示递归
- 递归的基本原理
- 尾递归
- 递归和倒序计算
- 递归的优缺点
9.4 编译多源代码文件的程序
- UNIX
- Linux
- DOS命令行编译
- Windows和苹果的IDE编译器
- 使用头文件
9.5 查找地址:&运算符
9.6 更改主调函数中的变量
9.7 指针简介
- 间接运算符:*
- 声明指针
- 使用指针在函数间通信
10 第10章 数组和指针
10.1 数组
- 初始化数组
- 指定初始化器
- 给数组元素赋值
- 数组边界
- 指定数组的大小
10.2 多维数组
- 初始化二维数组
- 其他多维数组
10.3 指针和数组
10.4 函数、数组和指针
- 使用指针形参
- 指针表示法和数组表示法
10.5 指针操作
10.6 保护数组中的数据
- 对形式参数使用const
- const的其他内容
10.7 指针和多维数组
- 指向多维数组的指针
- 指针的兼容性
- 函数和多维数组
10.8 变长数组(VLA)
10.9 复合字面量
11 第11章 字符串和字符串函数
11.1 表示字符串和字符串I/O
- 在程序中定义字符串
- 指针和字符串
11.2 字符串输入
- 分配空间
- 不幸的gets()函数
- gets()的替代品
- scanf()函数
11.3 字符串输出
- puts()函数
- fputs()函数
- printf()函数
11.4 自定义输入/输出函数
11.5 字符串函数
- strlen()函数
- strcat()函数
- strncat()函数
- strcmp()函数
- strcpy()和strncpy() 函数
- sprintf()函数
- 其他字符串函数
11.6 字符串示例:字符串排序
- 排序指针而非字符串
- 选择排序算法
11.7 ctype.h字符函数和字符串
11.8 命令行参数
- 集成环境中的命令行参数
- Macintosh中的命令行参数
11.9 把字符串转换为数字
12 第12章 存储类别、链接和内存管理
12.1 存储类别
- 作用域
- 链接
- 存储期
- 自动变量
- 寄存器变量
- 块作用域的静态变量
- 外部链接的静态变量
- 内部链接的静态变量
- 多文件
- 存储类别说明符
- 存储类别和函数
- 存储类别的选择
12.2 随机数函数和静态变量
12.3 实例:掷骰子
12.4 分配内存:malloc()和free()
- free()的重要性
- calloc()函数
- 动态内存分配和变长数组
- 存储类别和动态内存分配
12.5 ANSI C类型限定符
- const类型限定符
- volatile类型限定符
- restrict类型限定符
- _Atomic类型限定符( C11)
- 旧关键字的新位置
13 第13章 文件输入/输出
13.1 与文件进行通信
- 文件是什么
- 文本模式和二进制模式
- I/O的级别
- 标准文件
13.2 标准I/O
- 检查命令行参数
- fopen()函数
- getc()和putc()函数
- 文件结尾
- fclose()函数
- 指向标准文件的指针
13.3 实例:一个简单的文件压缩程序
13.4 文件I/O:fprintf()、fscanf()、fgets()和fputs()
- fprintf()和fscanf() 函数
- fgets()和fputs()函数
13.5 随机访问:fseek()和ftell()
- fseek()和ftell()的工作原理
- 二进制模式和文本模式
- 可移植性
- fgetpos()和fsetpos()函数
13.6 标准I/O的机理
13.7 其他标准I/O函数
- int ungetc(int c, FILE *fp)函数
- int fflush()函数
- int setvbuf()函数
- 二进制I/O:fread()和fwrite()
- size_t fwrite()函数
- size_t fread()函数
- int feof(FILE *fp)和int ferror(FILE *fp)函数
- 一个程序示例
- 用二进制I/O进行随机访问
14 第14章 结构和其他数据形式
14.1 建立结构声明
14.2 定义结构变量
- 初始化结构
- 访问结构成员
- 结构的初始化器
14.3 结构数组
- 声明结构数组
- 标识结构数组的成员
- 程序讨论
14.4 嵌套结构
14.5 指向结构的指针
- 声明和初始化结构指针
- 用指针访问成员
14.6 向函数传递结构的信息
- 传递结构成员
- 传递结构的地址
- 传递结构
- 其他结构特性
- 结构和结构指针的选择
- 结构中的字符数组和字符指针
- 结构、指针和malloc()
- 复合字面量和结构(C99)
- 伸缩型数组成员(C99)
- 匿名结构(C11)
- 使用结构数组的函数
14.7 把结构内容保存到文件中
- 保存结构的程序示例
- 程序要点
14.8 链式结构
14.9 联合简介
- 使用联合
- 匿名联合(C11)
14.10 枚举类型
- enum 常量
- 默认值
- 赋值
- enum 的用法
- 共享名称空间
14.11 typedef简介
14.12 其他复杂的声明
14.13 函数和指针
15 第15章 位操作
15.1 二进制数、位和字节
- 二进制整数
- 有符号整数
- 二进制浮点数
15.2 其他进制数
- 八进制
- 十六进制
15.3 C按位运算符
- 按位逻辑运算符
- 用法:掩码
- 用法:打开位(设置位)
- 用法:关闭位(清空位)
- 用法:切换位
- 用法:检查位的值
- 移位运算符
15.4 位字段
- 位字段示例
- 位字段和按位运算符
15.5 对齐特性(C11)
16 第16章 C预处理器和C库
16.1 翻译程序的第一步
16.2 明示常量:define
- 记号
- 重定义常量
16.3 在define中使用参数
- 用宏参数创建字符串:#运算符
- 预处理器黏合剂:##运算符
- 变参宏:…和_ VA_ARGS _
16.4 宏和函数的选择
16.5 文件包含:include
- 定义头文件
- 使用头文件
16.6 其他指令
- #undef指令
- 从C预处理器角度看已定义
- 条件编译
- 预定义宏
- #line和#error
- #pragma
- 泛型选择(C11)
16.7 内联函数(C99)
16.8 _Noreturn函数(C11)
16.9 C库
- 访问C库
- 使用库描述
16.10 数学库
- 三角问题
- 类型变体
- tgmath.h库(C99)
16.11 通用工具库
- exit()和atexit()函数
- qsort()函数
16.12 断言库
- assert的用法
- _Static_assert
16.13 string.h库中的memcpy()和memmove()
16.14 可变参数:stdarg.h
17 第17章 高级数据表示
17.1 研究数据表示
17.2 从数组到链表
17.3 抽象数据类型(ADT)
- 建立抽象
- 建立接口
- 使用接口
- 实现接口
17.4 队列ADT
- 定义队列抽象数据类型
- 定义一个接口
- 实现接口数据表示
- 测试队列
17.5 用队列进行模拟
17.6 链表和数组
17.7 二叉查找树
- 二叉树ADT
- 二叉查找树接口
- 二叉树的实现
- 使用二叉树
- 树的思想