一、指针与内存管理高频题
1. 指针与数组的区别与联系
核心原理:数组名在大多数表达式中被转换为指向其首个元素的指针常量,但`sizeof`操作时例外(返回整个数组大小)。指针是变量,存储地址,可重新赋值。
实战例题:`int a; int p = a;` 问 `sizeof(a)` 与 `sizeof(p)` 结果有何不同?(64位系统下,前者可能为20字节,后者为8字节)。
关键点:理解“数组退化”现象——数组作为函数参数传递时,实际上传递的是指针。
2. `const char p`, `char const p`, `char const p` 的区别
核心解析:从右向左读。`const char p`(同`char const p`):指针指向的字符内容不可变,指针本身可变。`char const p`:指针本身是常量(指向不可变),指向的内容可变。
面试陷阱:常考与`char const p`等更复杂声明的结合。
3. 内存泄漏与野指针
高频问法:什么是内存泄漏?野指针产生原因及危害?
精讲要点:内存泄漏指动态分配的内存未释放且失去引用。野指针指指向无效内存的指针(如已释放的地址、未初始化的指针)。防护措施:初始化`NULL`、释放后置`NULL`、使用前判断非空、确保作用域匹配。
二、数据结构与算法基础题
1. 链表操作
核心实现:手写单链表反转是必考题。原理:迭代法需要三个指针(prev, curr, next)遍历并反转指向;递归法则需理解从后向前反转的连接过程。
实战扩展:链表找环(快慢指针法)、合并两个有序链表。
2. 栈与队列的应用
原理精讲:栈(后进先出)常用于函数调用、括号匹配、表达式求值。队列(先进先出)用于缓冲区、任务调度。
面试题示例:用两个栈实现一个队列的功能(思路:一个栈用于入队,另一个用于出队,当出队栈空时,将入队栈的全部元素弹出并压入出队栈)。
三、关键字与预处理器深度题
1. `static`关键字的三种用法
在函数内:修饰局部变量,使其生命周期延长至整个程序运行期,仅初始化一次(用于函数调用间状态保持)。
在全局变量/函数前:限定该变量或函数的作用域仅为本文件(实现隐藏)。
在C++中(常问扩展):类数据成员/成员函数,属于类而非对象,可实现共享。
2. `volatile`关键字的用途
核心原理:阻止编译器对变量进行优化(如缓存到寄存器),强制每次从内存读取。用于指向可能被硬件、中断或多线程意外修改的变量。
典型场景:嵌入式系统的硬件寄存器、多线程共享的标志变量。
3. `define`与`const`的区别
本质区别:`define`是预处理期文本替换,无类型检查,不分配内存(宏定义)。`const`是编译期常量,有类型检查,分配存储空间(只读变量)。
优劣分析:`const`更安全,可调试,推荐优先使用;`define`在条件编译、宏函数等场景仍有价值。
四、函数与进程内存模型题
1. 函数参数传递方式
核心原理:C语言只有值传递。所谓“指针传递”本质仍是值传递,传递的是指针变量本身的副本(地址值),通过该副本可间接修改原目标数据。
面试验证:要求分析`void swap(int a, int b)`函数内部交换指针本身与交换指针所指内容的区别。
2. 程序的内存布局
高频考点:请描述C程序的内存分区。
精讲要点:从低地址到高地址通常分为——代码段(text)、已初始化数据段(data)、未初始化数据段(bss)、堆(heap,手动分配管理,向上增长)、栈(stack,自动管理,向下增长,存放局部变量、函数调用信息)。需能说清各段存储内容及增长方向。
五、复杂声明与综合应用题
1. 分析复杂指针声明(如`int ((func))`)
解析方法:从标识符(func)开始,先右后左,逐步剥离。此题解析:func是一个包含5个元素的数组;每个元素是指向函数的指针;该函数返回一个指针;该返回指针指向一个返回int的函数。
面试技巧:遇到这种题,冷静使用“从内到外,从右向左”法则拆解,并尝试用`typedef`简化。
2. 位运算实战题
常见题:不用临时变量交换两个整数。解法:`a ^= b; b ^= a; a ^= b;` 原理利用异或的自反性。
扩展:判断一个数是否是2的幂(`(n & (n-1)) == 0 && n > 0`),统计二进制中1的个数(循环与`n &= (n-1)`)。
六、多线程与并发初探题
虽C标准库不直接支持,面试常考概念:什么是线程安全?如何用互斥锁保护共享数据?可结合`pthread`库或操作系统原理简述。
死锁产生的四个必要条件及预防策略(互斥、请求与保持、不剥夺、循环等待)。
总结应对策略:面试回答时,先清晰定义概念,再阐述核心原理,然后举例或代码说明,最后可能的话简述应用场景或潜在风险。对于代码题,务必先理清思路,边写边注释,写完自行检查边界条件(如空指针、零长度等)。对不懂的问题,诚实说明了解边界并表示学习意愿,切忌胡编乱造。