1. C语言面试问题精要解析(1~20题)
作为在嵌入式行业摸爬滚打十年的老工程师,我面试过上百名C语言开发者,发现80%的候选人都倒在这些基础问题上。今天我就把压箱底的20个高频问题整理出来,每个问题都附带工程实践中的深度解析。这些不是死记硬背的答案,而是真正能让你写出健壮代码的实战经验。
提示:本文所有示例代码都在STM32F103和Linux gcc 9.4环境下实测通过,建议边看边动手验证
1.1 static关键字的三大应用场景
static在C语言中有三个典型用法,每个用法背后都有其设计哲学:
c复制// 场景1:修饰局部变量(存储在静态区)
void counter() {
static int count = 0; // 只初始化一次
count++;
printf("%d\n", count);
}
// 场景2:修饰全局变量(限制作用域)
static int internal_var; // 仅当前文件可见
// 场景3:修饰函数(限制作用域)
static void internal_func() {} // 仅当前文件可调用
工程经验:
- 在RTOS中常用static变量保存任务状态,避免被意外修改
- 模块化开发时,用static隐藏内部实现细节(类似C++的private)
- 嵌入式开发中,static变量默认初始化为0的特性可以节省FLASH空间
1.2 指针与引用的本质区别
虽然C++才有引用,但面试官常会对比提问。看这个内存模型图:
code复制指针变量本身 --> 目标内存地址 --> 实际数据
(占用4/8字节) (存储地址值) (操作对象)
而引用是编译器实现的语法糖,本质上还是指针操作。关键区别:
- 指针可以为NULL,引用必须绑定对象
- 指针可以重定向,引用绑定后不可变
- sizeof(指针)返回地址大小,sizeof(引用)返回目标类型大小
嵌入式实战技巧:
- 在STM32 HAL库中,所有外设句柄都是指针(如GPIO_TypeDef*)
- 寄存器操作必须用volatile指针,防止编译器优化
- 指针运算在DMA配置中特别重要(计算缓冲区偏移)
1.3 数组指针 vs 指针数组
这是让无数初学者头疼的概念,用实际代码说明:
c复制// 指针数组:每个元素都是指针
char* str_array[3] = {"hello", "world", "!"};
// 数组指针:指向整个数组的指针
int (*matrix_ptr)[4]; // 指向二维数组的行指针
内存布局对比:
| 类型 | 内存结构 | 典型应用场景 |
|---|
