面试 C 语言岗位,是不是一碰到指针题就手心冒汗?明明平时用过指针,可面试官一提问,脑子里就一团乱麻,简单的题也能答错。其实啊,指针面试题看着难,考来考去就那几个高频考点。今天兔子哥就把这些常考的题拎出来,一步步讲清楚解题思路,新手看完也能心里有底,一起往下看吧!
高频题一:指针与数组的访问,输出结果是啥?
题目:以下代码的输出结果是什么?
c运行
#include int main() {int arr[5] = {1,2,3,4,5};int *p = arr;printf("%d, %d\n", *(p + 2), p[2]);printf("%d, %d\n", *(arr + 2), arr[2]);return 0;}很多新手看到这题,会纠结 “p 和 arr 到底有啥不一样”,其实啊,这题考的是指针和数组名在访问元素时的共性。
解题步骤:
p是指向数组首元素的指针,p + 2就是往后移 2 个元素的地址,*(p + 2)就是第 3 个元素,值是 3;p[2]等价于*(p + 2),也是 3。- 数组名
arr是首元素地址的常量指针,arr + 2同样是第 3 个元素的地址,*(arr + 2)和arr[2]也都是 3。
所以输出结果是 “3, 3” 和 “3, 3”。是不是比想象中简单?这题的关键是记住:数组下标访问和指针偏移访问,在编译器眼里是一回事。
高频题二:指针运算,这个 ++ 到底怎么算?
题目:下面代码输出啥?
c运行
#include int main() {int a = 10;int *p = &a;printf("%d, ", *p++);printf("%d\n", *p);return 0;}这题考的是指针的自增运算和运算符优先级,新手很容易在
*p++这里栽跟头。解题步骤:
*p++中,++的优先级比*高,但它是后置 ++,所以先取*p的值(10),再让p往后移一位。- 这时候
p已经不指向a了,指向了未知内存,*p的值是乱码(可能是任意数,取决于内存情况)。
所以第一个输出是 10,第二个输出是不确定的乱码。很多人会误以为第二个输出是 11,其实不是,
p++移动的是指针,不是改变a的值。记住:指针的 ++ 是地址变,不是值变。高频题三:函数指针,怎么调用才对?
题目:如何通过函数指针调用下面的 add 函数?
c运行
int add(int a, int b) {return a + b;}函数指针是面试高频考点,尤其是嵌入式岗位,考的概率特别大。
解题步骤:
- 先定义函数指针:函数指针的格式是 “返回值类型 (* 指针名)(参数类型)”,所以 add 的指针应该是
int (*p)(int, int);。 - 让指针指向函数:
p = add;(注意不用 &,函数名本身就是地址)。 - 调用方式:有两种,
(*p)(2, 3)或者p(2, 3),两种都对,结果都是 5。
很多新手会把函数指针定义写成
int *p(int, int);,这就错了,这是声明一个返回 int * 的函数,不是指针。必须加括号(*p),这点一定要记牢。高频题四:野指针和空指针,区别在哪?
面试官可能会问:“野指针和空指针有啥区别?怎么避免野指针?”
这题考的是指针的基础概念,看似简单,答不全就会扣分。
解题思路:
- 空指针是明确指向 NULL 的指针,比如
int *p = NULL;,NULL 其实是 0,访问会报错但不会乱改内存。 - 野指针是指向未知地址的指针,比如
int *p;没初始化就用,或者free(p)后没置空,这时候访问可能崩溃,也可能改了不该改的内存,特别危险。
避免野指针的方法:
- 定义指针时马上初始化,要么指向变量,要么设为 NULL。
- free 后立即
p = NULL;。 - 函数参数传递指针时,先检查是否为 NULL。
易错点对比表
| 考点 | 常见错误 | 正确做法 |
|---|---|---|
| 指针数组 vs 数组指针 | 把int *arr[5]当成数组指针 | int *arr[5]是指针数组(存指针的数组),int (*p)[5]是数组指针(指向数组的指针) |
| 二级指针传参 | 想用一级指针接收二级指针的值 | 传二级指针必须用二级指针接收,比如void func(int **p) |
| 指针常量 vs 常量指针 | 分不清int *const p和const int *p | int *const p:指针不能改,指向的值能改;const int *p:指向的值不能改,指针能改 |
可能有人会问,这些题看着不难,为啥面试时总答错?其实啊,不是难在知识点,是难在细节。比如指针运算那题,很多人知道后置 ++,但一紧张就忘了指针移动后指向的是未知内存。
兔子哥面试的时候,就被问过函数指针的题,当时把定义写错了,好在面试官提醒,才反应过来。后来总结出个规律:指针题不管怎么变,都离不开 “地址” 和 “值” 的关系,抓住这一点,再复杂的题也能拆解开。
准备面试的时候,别只背答案,多动手写代码试试。比如数组指针那块,自己敲一遍
int (*p)[3] = arr;,打印几个值,比死记硬背强多了。面试时遇到不会的,也别慌,把自己能想到的思路说出来,面试官有时候看的不是答案,是你的分析过程。希望这些能帮到你,祝你面试顺利!版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~