### C语言终极面试宝典知识点解析
#### 一、关键字`static`的作用
在C语言中,`static`关键字有着非常重要的用途,主要用于控制变量或函数的可见性和生命周期。具体来说,`static`关键字有以下三个主要作用:
1. **在函数内部**:当在一个函数内部声明一个变量为`static`时,该变量在整个程序执行期间只会被初始化一次,并且在函数调用之间保持其值不变。这意味着即使函数返回并再次被调用,该变量仍保留其上次调用结束时的值。
2. **在模块内部(函数外部)**:当在模块内部(通常是在`.c`文件中,而非函数内部)声明一个变量为`static`时,该变量成为模块内的全局变量。这意味着它只能被该模块内的其他函数访问,而不能被其他模块访问。这种限制有助于提高程序的安全性和可维护性。
3. **在模块内部声明的`static`函数**:当在模块内部声明一个函数为`static`时,该函数仅限于该模块内使用。这样可以避免与其他模块中的函数名称冲突,同时也增加了代码的封装性。
#### 二、“引用”与指针的区别
1. **初始化**:引用必须在声明时进行初始化,而指针则不一定需要立即初始化。
2. **可修改性**:一旦引用被初始化后,就不能再重新绑定到其他对象。而指针可以随时改变其所指向的对象。
3. **空值**:引用始终指向一个具体的对象,不能指向空值。而指针可以指向空值,表示没有指向任何对象。
#### 三、`.h`头文件中的`ifndef/define/endif`的作用
`ifndef/define/endif`这三个预处理指令通常用于防止头文件被多次包含。这在项目中有多个文件相互包含的情况下非常重要,可以避免变量或函数被重复声明,从而导致编译错误。
例如:
```c
#ifndef HEADER_H
#define HEADER_H
// 头文件内容
#endif // HEADER_H
```
#### 四、`#include <file.h>`与`#include "file.h"`的区别
- `#include <file.h>`:该形式的包含通常用于标准库文件,编译器会在标准库路径下查找指定的文件。
- `#include "file.h"`:这种形式通常用于包含用户自定义的头文件,编译器首先会在当前工作目录下查找文件,如果找不到,则再到标准库路径下查找。
#### 五、实时系统的基本特性
实时系统是指那些必须在特定时间内完成特定任务的系统,这类系统的两个关键特性是实时性和可靠性:
- **实时性**:确保在预定的时间内完成任务。
- **可靠性**:保证系统在各种条件下都能稳定运行。
#### 六、全局变量与局部变量在内存中的区别
- **全局变量**:通常位于静态数据区或全局数据段,整个程序运行期间一直存在。
- **局部变量**:位于栈中,随着函数的调用创建和销毁。
#### 七、平衡二叉树的定义
平衡二叉树是一种特殊的二叉搜索树,它满足每个节点的左子树和右子树的高度差不超过1。
#### 八、堆栈溢出的原因
常见的原因包括:
- 没有释放不再使用的内存,导致内存泄漏。
- 过深的递归调用,消耗过多的栈空间。
#### 九、冒泡排序算法的时间复杂度
冒泡排序的时间复杂度为O(n^2),其中n是数组元素的数量。
#### 十、不能声明为虚函数的成员
构造函数不能声明为虚函数。
#### 十一、队列与栈的区别
- **队列**:先进先出(FIFO)的数据结构。
- **栈**:后进先出(LIFO)的数据结构。
#### 十二、不能作为`switch()`的参数类型
`switch()`的参数不能为实型数据类型。
#### 十三、局部变量与全局变量重名
在C语言中,局部变量可以与全局变量重名。在函数内部,局部变量会屏蔽同名的全局变量。如果需要在函数内部使用全局变量,可以通过使用作用域解析运算符`::`来明确指定。
#### 十四、引用全局变量的方法
可以通过引用头文件或者使用`extern`关键字来引用其他文件中定义的全局变量。使用`extern`关键字时,如果出现拼写错误,编译器在编译阶段不会报错,但在链接阶段会报错。
#### 十五、在可被多个`.C`文件包含的头文件中定义全局变量
可以在头文件中声明全局变量,并在其中一个`.C`文件中实际定义该变量。其他`.C`文件可以使用`extern`关键字来引用该变量。这样可以避免命名冲突。
#### 十六、`for(;;)`语句的意义
该语句表示无限循环,等价于`while(1)`。
#### 十七、`do...while`与`while...do`的区别
- `do...while`:先执行一次循环体,然后再判断条件是否成立。
- `while...do`:先判断条件是否成立,然后才可能执行循环体。
#### 十八、`static`全局变量、局部变量、函数的特点
- **静态全局变量**:限制了全局变量的作用域,使其仅在定义它的源文件内有效。
- **静态局部变量**:改变了局部变量的存储方式,使得变量在整个程序运行期间一直存在。
- **静态函数**:限制了函数的作用域,使其仅在定义它的源文件内有效。