### C语言面试题大汇总之华为面试知识点解析 #### 一、局部变量能否和全局变量重名? 在C语言中,局部变量是可以与全局变量同名的。这种情况下,局部变量会在其作用域内“屏蔽”掉全局变量,也就是说,在局部变量的作用域内对变量的引用实际上是针对局部变量的,而非全局变量。例如: ```c int globalVar = 10; // 全局变量 void func() { int globalVar = 20; // 局部变量,与全局变量同名 printf("局部变量 globalVar 的值:%d\n", globalVar); // 输出 20 } int main() { func(); printf("全局变量 globalVar 的值:%d\n", globalVar); // 输出 10 return 0; } ``` 需要注意的是,在某些编译器中,可以在同一个函数内多次定义同名的局部变量,但每个局部变量的作用域通常仅限于定义它的代码块或循环体。 #### 二、如何引用一个已经定义过的全局变量? 引用全局变量可以通过两种方式实现: 1. **使用 `extern` 关键字**:如果想要在另一个文件中使用一个已经在其他文件中定义的全局变量,可以使用 `extern` 关键字来声明该变量。例如: ```c // 文件1: var.c extern int myGlobalVar; // 文件2: var.h int myGlobalVar = 10; // 文件3: main.c #include "var.h" void useGlobal() { printf("myGlobalVar 的值:%d\n", myGlobalVar); // 输出 10 } ``` 2. **引用头文件**:通过包含定义全局变量的头文件来间接引用。这种方式需要确保头文件中的声明没有错误,否则编译时会报错。 #### 三、全局变量是否可以定义在可被多个.C文件包含的头文件中? 全局变量确实可以在一个被多个`.c`文件包含的头文件中定义。然而,为了防止链接错误,必须确保只有一个`.c`文件对该全局变量进行初始化。如果多个文件尝试初始化同一个全局变量,则会导致链接错误。为了避免这种情况,可以使用`static`关键字来声明全局变量,使其仅在定义它的文件中可见,例如: ```c // file1.c #include "global_var.h" int x = 10; // 初始化 x // file2.c #include "global_var.h" int y = 20; // 初始化 y // global_var.h extern int x; // 声明 x extern int y; // 声明 y ``` 在这种情况下,每个文件都可以访问全局变量`x`和`y`,但是只有`file1.c`和`file2.c`分别对它们进行了初始化。 #### 四、`for(;;)`语句表示什么? `for(;;)` 表示一个无限循环,相当于 `while(true)`。这个循环将持续运行,直到遇到`break`或`return`语句为止。 #### 五、`do...while` 和 `while...do` 有什么区别? 1. **`do...while`**:首先执行循环体内的代码至少一次,然后检查循环条件。如果条件为真,则继续循环;如果条件为假,则退出循环。 2. **`while...do`**:先检查循环条件,如果条件为真,则执行循环体内的代码;如果条件为假,则不执行循环体内的代码并直接退出。 #### 六、示例代码解析 考虑下面的示例代码: ```c #include <stdio.h> int main() { int a, b, c, d; a = 10; b = a++; /*a的值先赋值给b,然后a再自加1*/ c = ++a; /*a先自加1,再赋值给c*/ d = 10 * a++; printf("b, c, d: %d, %d, %d\n", b, c, d); return 0; } ``` 输出结果是 `b, c, d: 10, 12, 120`。 这里的关键在于理解`a++`与`++a`的区别:`a++`是先使用`a`的当前值再自增,而`++a`是先自增再使用新的值。 #### 七、`static`关键字的作用 1. **`static`全局变量**:只在定义它的源文件内有效,不会被其他源文件访问。这样可以避免命名冲突,并且只初始化一次。 2. **`static`局部变量**:在函数调用结束后仍然保留其值,下次函数调用时保持上次调用结束后的状态。 3. **`static`函数**:仅在定义它的源文件内部可见,不能被其他源文件调用。 #### 八、内存布局 - **局部变量**:存在于堆栈中。 - **全局变量**:存在于静态区中。 - **动态申请的数据**:存在于堆中。 #### 九、联合(`union`)与结构体(`struct`)的大小计算 给定以下类型定义: ```c typedef union { long i; int k[5]; char c; } DATE; struct data { int cat; DATE cow; double dog; } too; DATE max; ``` 对于`printf("%d", sizeof(struct date) + sizeof(max));`的输出结果是52。 解释如下: - `DATE` 是一个联合体,其成员共用同一段内存空间,最大成员为 `int k[5]`,占用20字节。 - `struct data` 包含三个成员,`int cat` 占用4字节,`DATE cow` 占用20字节(与上面一致),`double dog` 占用8字节,总共32字节。 - 所以,`sizeof(struct date)` 为32字节,`sizeof(max)` 为20字节,合计52字节。 #### 十、队列与栈的区别 - **队列**:先进先出(FIFO)。插入操作通常发生在队尾,删除操作通常发生在队首。 - **栈**:后进先出(LIFO)。插入和删除操作通常都在栈顶进行。 #### 十一、示例代码解析 考虑以下代码: ```c #include <stdio.h> int inc(int a) { return (++a); } int multi(int *a, int *b, int *c) { return (*c = *a * *b); } typedef int (FUNC1)(int in); typedef int (FUNC2)(int *, int *, int *); void show(FUNC2 fun, ...) { // 示例代码省略了实际的参数传递逻辑 } ``` 此代码定义了两个函数`inc`和`multi`,以及两个函数指针类型`FUNC1`和`FUNC2`。其中`show`函数接受一个`FUNC2`类型的函数作为参数,但具体实现细节未给出。
剩余7页未读,继续阅读
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助