### C语言经典面试题知识点详解
#### Static关键字的用途
1. **限制变量的作用域**:通过使用`static`关键字,可以将变量的作用域限制在其所在的文件或块中,而不是整个程序。这意味着即使在多个文件中声明了同名的静态变量,它们也互不影响,各自独立。
2. **设置变量的存储域**:`static`变量存储在全局内存区域(静态存储区),而不是在栈或堆中。这意味着它们在整个程序运行期间都保持有效,不会随着函数调用结束而消失。
#### 引用与指针的区别
1. **初始化**:引用在定义时必须被初始化,并且一旦初始化后就不能改变其指向。而指针可以在定义时不进行初始化,并且可以通过重新赋值来改变其所指向的对象。
2. **空值**:不存在未绑定的引用,即引用必须始终指向一个对象。然而,指针可以被设置为`NULL`,表示它不指向任何对象。
3. **可变性**:引用初始化后不能改变指向的对象,而指针可以通过赋值改变指向的对象。
#### 实时系统的特性
实时系统的关键特性包括:
- **实时性**:系统必须在限定的时间内响应外部事件。
- **可靠性**:系统需要高度可靠,确保在规定时间内完成任务。
#### 全局变量与局部变量的区别
- **全局变量**:存储在静态数据区,生命周期从程序启动到程序终止。
- **局部变量**:存储在栈上,生命周期仅限于函数执行期间。
#### 平衡二叉树定义
平衡二叉树是一种特殊的二叉树,满足以下条件:
- 左右子树都是平衡二叉树。
- 左右子树的高度差不超过1。
#### 堆栈溢出的原因
常见的堆栈溢出原因包括:
- 函数递归调用过深,导致栈空间耗尽。
- 在栈上分配过大内存的对象,超出栈空间限制。
#### 构造函数与虚函数
在C++中,构造函数不能被声明为虚函数。这是因为构造函数在对象创建时被调用,而虚函数机制是在运行时动态绑定的,这与构造函数的性质不符。
#### 冒泡排序算法的时间复杂度
冒泡排序的时间复杂度为O(n^2),其中n是数组的长度。这是一种简单但效率较低的排序算法,适用于小规模数据集。
#### 浮点数与零值的比较
正确的比较方式应该是检查浮点数是否接近零,而不是严格等于零。例如:
```c
if (fabs(x) < 0.000001) {
// x接近零
}
```
#### Internet的网络协议及其层次结构
Internet主要采用了TCP/IP协议族,其层次结构包括:
- **应用层**:如HTTP、FTP等协议。
- **传输层**:TCP(传输控制协议)和UDP(用户数据报协议)。
- **网络层**:IP(互联网协议)。
- **数据链路层**:如以太网协议。
- **物理层**:规定了物理信号的传输方式。
#### Internet物理地址与IP地址的转换
地址解析协议(ARP)用于将IP地址转换为物理地址(MAC地址)。在网络通信中,发送方使用ARP请求接收方的MAC地址,以便正确地将数据包发送到目标设备。
#### IP地址的组成部分
IP地址分为两部分:
- **网络号**:标识网络段。
- **主机号**:标识网络上的具体设备。
#### 循环输出特定值的C程序
要实现题目描述的功能,可以使用循环链表和取余操作实现。具体的算法设计取决于具体的要求。
#### switch语句的参数类型限制
`switch`语句的参数类型不能为实型。这是因为`switch`中的case值必须是整型或枚举类型的常量表达式。
#### 局部变量与全局变量的关系
- **重名处理**:局部变量可以与全局变量同名,在函数内会使用局部变量而非全局变量。若需使用全局变量,需显式使用`::`运算符。
- **引用全局变量**:可以通过`extern`关键字引用已定义的全局变量,或者通过包含声明该变量的头文件来引用。
- **全局变量的定义位置**:可以定义在被多个`.c`文件包含的头文件中,但需要确保在每个文件中使用`static`关键字声明以限制其可见性。
#### for(;1;)的意义
这种写法等同于`while(1)`,表示一个无限循环。
#### do...while与while...do的区别
- `do...while`:先执行循环体至少一次,然后判断条件是否成立。
- `while...do`:先判断条件是否成立,如果成立才执行循环体。
#### 示例代码分析
```c
#include <stdio.h>
int main() {
int a, b, c, d;
a = 10;
b = a++; // b = 10
c = ++a; // c = 12
d = 10 * a++; // d = 120
printf("b, c, d: %d, %d, %d\n", b, c, d);
return 0;
}
```
输出结果为:
```
b, c, d: 10, 12, 120
```
#### static全局变量与局部变量的区别
- **static全局变量**:在整个程序执行期间存在,但作用域仅限于定义它的源文件。
- **static局部变量**:仅在定义它的函数内部可见,但在每次函数调用之间保留值。
- **static函数**:仅在当前源文件中可见,不能被其他文件调用。