### C语言应聘题目知识点解析
#### 一、Static 关键字的用途
1. **限制变量的作用域**:通过在全局变量前加上`static`关键字,可以将其作用域限制在其所在的源文件内,使得其他源文件无法访问此变量。这有助于避免命名冲突,并确保变量的值不被意外地修改。
2. **设置变量的存储域**:当在函数内部使用`static`关键字声明局部变量时,该变量将在程序的整个生命周期中保留其值,即使函数返回也不会销毁。这意味着下次调用该函数时,`static`局部变量将保留上次调用结束时的值。
#### 二、引用与指针的区别
1. **初始化**:引用必须在声明时初始化,并且一旦初始化后就不能更改其所引用的对象。而指针可以在声明时不初始化,之后可以通过赋值操作改变其所指向的对象。
2. **空值**:引用总是指向一个具体的对象,不存在指向空值的引用。但指针可以为空(`NULL`)或指向实际对象。
3. **改变指向**:引用一旦初始化后,就不能改变其指向的对象。而指针可以通过重新赋值来改变其指向的对象。
#### 三、全局变量与局部变量的区别
- **内存位置**:全局变量通常存储在静态存储区中,而局部变量则存储在栈(stack)中。
- **生命周期**:全局变量在整个程序运行期间一直存在,而局部变量在其作用域内存在,在离开作用域后被销毁。
#### 四、堆栈溢出的原因
- 堆栈溢出通常是由于递归调用次数过多或局部变量占用空间过大而导致的。例如,深度递归或在函数中分配大量局部数组等操作都可能导致堆栈溢出。
#### 五、不能声明为虚函数的情况
- 构造函数不能声明为虚函数。这是因为构造函数在对象创建时调用,而虚函数机制依赖于指针或引用指向对象实例,此时对象尚未创建完成,因此构造函数无法实现多态性。
#### 六、冒泡排序算法的时间复杂度
- 冒泡排序的时间复杂度为\(O(n^2)\),其中n表示待排序序列的长度。这种排序方法效率较低,适用于小规模数据的排序。
#### 七、浮点数与零值的比较
- 浮点数与零值的比较通常需要注意浮点数的精度问题。正确的比较方式可以是检查其绝对值是否小于某个非常小的正数(如\(0.000001\)),例如:`if (fabs(x) < 0.000001)`。
#### 八、不能作为switch()参数的类型
- `switch`语句中的表达式不能为浮点类型(如`float`、`double`)。这是因为浮点数的精确值可能难以确定,容易造成case匹配失败。
#### 九、局部变量与全局变量重名的问题
- 局部变量与全局变量可以重名,局部变量会“屏蔽”同名的全局变量。在函数内使用局部变量时,优先使用局部变量,而非全局变量。如果要在函数内使用全局变量,需要使用`::`操作符显式指定。
#### 十、引用已定义的全局变量
- 使用`extern`关键字可以在当前文件中引用其他文件中定义的全局变量。这种方式允许我们在不同的源文件之间共享变量。
#### 十一、全局变量在可被多个.C文件包含的头文件中的定义
- 可以在多个.C文件中通过使用`static`关键字来声明同一个全局变量。这样做的目的是限制变量的作用域仅限于声明它的文件内部,从而避免了多个.C文件之间因全局变量名称相同而引起的冲突问题。
#### 十二、示例代码解析
```c
#include<stdio.h>
main() {
int a, b, c, d;
a = 10;
b = a++; // a变为11, b为10
c = ++a; // a变为12, c为12
d = 10 * a++; // a变为13, d为120
printf("b,c,d:%d,%d,%d\n", b, c, d);
return 0;
}
```
- 输出结果为:`b,c,d:10,12,120`
#### 十三、Static 的使用细节
- **静态全局变量**:限制了其作用域,使其只能在定义它的源文件内有效。
- **静态局部变量**:只被初始化一次,每次函数调用后仍保留其值。
- **静态函数**:只在定义它的源文件内有效,不能被其他文件访问。
#### 十四、程序数据存储区域
- **局部变量**:存在于栈中。
- **全局变量**:存在于静态区。
- **动态申请的数据**:存在于堆中。
#### 十五、结构体和联合体大小计算
```c
typedef union { long i; int k[5]; char c; } DATE;
struct data { int cat; DATE cow; double dog; } too;
DATE max;
```
- `DATE`是一个联合体,其大小由最大成员决定,这里是`int k[5]`,共20字节。
- `struct data`包含一个整型变量`cat`(4字节)、一个`DATE`类型的变量`cow`(20字节)和一个双精度浮点型变量`dog`(8字节),总共32字节。
- `max`是`DATE`类型,大小为20字节。
- 因此,`printf("%d", sizeof(struct data) + sizeof(max))`的结果是52。