### C 语言深度解剖——核心知识点解析 #### 前言 《C 语言深度解剖》一书并非从零开始介绍C语言基础知识,它更侧重于深入探讨C语言中的高级概念和技术细节,旨在帮助读者掌握那些在面试或笔试中常见的难点问题。 #### 第一章 关键字 **1.1 最宽恒大量的关键字——auto** - **定义**:`auto`关键字用于声明一个自动变量,即局部变量。 - **作用**:它告诉编译器该变量是在函数调用时动态分配的,并且在函数退出后自动释放。 **1.2 最快的关键字——register** - **定义**:`register`关键字用于建议编译器将变量存储在CPU寄存器中。 - **用途**:通常用于频繁访问的变量,以提高性能。 - **注意点**: - 不是所有变量都能放在寄存器中; - 编译器有权忽略此建议; - `register`变量没有地址,因此不能对其取地址。 **1.2.1 皇帝身边的小太监——寄存器** - 寄存器是CPU内部的一部分,访问速度非常快。 - 使用`register`关键字可以尝试让编译器将变量放置于此。 **1.2.2 使用register修饰符的注意点** - 并非所有变量都适合放在寄存器中,尤其是较大的变量类型。 - 实际存储位置由编译器决定,不一定遵从`register`建议。 **1.3 最名不符实的关键字——static** - **修饰变量**:使变量具有静态生存期,即使函数多次调用,其值也保持不变。 - **修饰函数**:限制函数的作用域仅在当前文件内可见。 **1.4 基本数据类型——short、int、long、char、float、double** - **数据类型与“模子”**:这些关键字定义了不同大小的数据类型,用于存储不同类型的数据。 - **变量的命名规则**:遵循C语言的标准命名规则,如只能包含字母、数字和下划线,必须以字母或下划线开头等。 **1.5 最冤枉的关键字——sizeof** - **常被误认为函数**:实际上是一个运算符,用于获取变量或类型所占的字节数。 - **sizeof(int)*p的含义**:如果`p`是指向`int`类型的指针,则表达式的含义为`int`类型的大小乘以指针的值。 **1.6 signed、unsigned关键字** - **定义**:`signed`和`unsigned`用于指定整型变量是否可以为负数。 - **区别**:`signed`类型包括正数、负数和零;`unsigned`类型只包括非负数。 **1.7 if、else组合** - **bool变量与“零值”进行比较**:C语言中,非零值视为真,零值视为假。 - **float变量与“零值”进行比较**:需要注意浮点数的精度问题,通常不直接与零比较。 - **指针变量与“零值”进行比较**:通常使用`NULL`来表示空指针,而非数值零。 - **else与if配对**:根据代码结构确定,通常遵循就近原则。 - **if语句后的分号**:若`if`后面紧跟一个分号,则条件判断之后没有任何执行语句。 - **使用if语句的其他注意事项**:确保避免空条件分支、考虑边界情况等。 **1.8 switch、case组合** - **不要拿青龙偃月刀去削苹果**:比喻不要用复杂的工具解决简单的问题。 - **case关键字后面的值的要求**:必须是常量表达式,不能是变量。 - **case语句的排列顺序**:按照逻辑顺序排列,以便于阅读和理解。 - **使用case语句的其他注意事项**:确保所有可能的情况都被处理,或者使用`default`分支。 **1.9 do、while、for关键字** - **break与continue的区别**: - `break`:立即退出循环。 - `continue`:跳过当前循环的剩余部分,进入下一次迭代。 - **循环语句的注意点**:初始化、条件判断、循环变量更新三个部分都要明确。 **1.10 goto、return关键字** - **goto关键字**:非结构化的跳转语句,应谨慎使用。 - **return关键字**:用于从函数中返回值,结束函数执行。 **1.11 void关键字** - **voida?**:错误的用法,`void`通常用于指针或函数声明。 - **void修饰函数返回值和参数**:表示函数无返回值或无参数。 - **void指针**:可以指向任何类型的对象,但需要显式转换类型。 - **void不能代表一个真实的变量**:仅作为类型标识符使用。 **1.12 const关键字** - **const修饰的只读变量**:定义只读变量,不能被修改。 - **节省空间,避免不必要的内存分配**:使用`const`可以减少重复数据的存储。 - **修饰一般变量**:定义只读变量。 - **修饰数组**:定义数组中的元素为只读。 - **修饰指针**:可以限定指针本身不可变或指针指向的内容不可变。 - **修饰函数的参数**:保护传入的参数不被修改。 - **修饰函数的返回值**:标记函数返回值不可修改。 **1.13 最易变的关键字——volatile** - **定义**:`volatile`关键字用于标记变量可能在外部被修改。 - **用途**:通常用于硬件接口编程,确保编译器不会对这些变量进行优化。 **1.14 最会带帽子的关键字——extern** - **定义**:`extern`关键字用于声明一个变量或函数的定义位于其他文件中。 - **用途**:实现文件之间的数据共享。 **1.15 struct关键字** - **空结构体大小**:通常为0字节,但取决于编译器。 - **柔性数组**:允许在结构体末尾定义一个未知长度的数组。 - **struct与class的区别**:在C++中,`struct`默认成员权限为public,而`class`默认为private。 **1.16 union关键字** - **大小端模式对union类型数据的影响**:在不同的存储模式下,union中数据的字节顺序可能不同。 - **确认系统存储模式的方法**:可以通过编写简单的测试程序来检查字节顺序。 **1.17 enum关键字** - **枚举类型的使用方法**:定义一组命名的整数常量集合。 - **枚举与#define宏的区别**:枚举提供类型安全性和更好的可读性。 **1.18 伟大的缝纫师——typedef关键字** - **关于马甲的笑话**:通过`typedef`可以给已存在的类型起别名。 - **历史的误会**:原本意图为`typerename`,但后来约定俗成为`typedef`。 - **typedef与#define的区别**:`typedef`创建新类型,`#define`只是简单的文本替换。 - **#defineaint[10]与typedefinta[10]**:前者定义了一个宏,后者定义了一个新类型。 #### 第二章 符号 - **注释符号**:`//`用于单行注释,`/* */`用于多行注释。 - **接续符和转义符**:`\`用于连接多行输入和转义字符。 - **单引号、双引号**:单引号用于字符常量,双引号用于字符串常量。 - **逻辑运算符**:包括`&&`(逻辑与)、`||`(逻辑或)、`!`(逻辑非)。 - **位运算符**: - **左移和右移**:`<<`(左移),`>>`(右移)。 - **0x01<<2+3的值**:左移运算先计算移位数再进行操作。 - **花括号**:用于界定代码块。 以上仅为书中部分章节的核心知识点总结,通过深入学习这些内容,读者可以更好地理解C语言的高级特性和编程技巧,从而提高自己的编程水平。
剩余110页未读,继续阅读
- 粉丝: 16
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助