c语言指针面试题高频考点含详细解题思路

admin C语言 32


面试 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 到底有啥不一样”,其实啊,这题考的是指针和数组名在访问元素时的共性。
解题步骤
  1. p是指向数组首元素的指针,p + 2就是往后移 2 个元素的地址,*(p + 2)就是第 3 个元素,值是 3;p[2]等价于*(p + 2),也是 3。
  2. 数组名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++这里栽跟头。
解题步骤
  1. *p++中,++的优先级比*高,但它是后置 ++,所以先取*p的值(10),再让p往后移一位。
  2. 这时候p已经不指向a了,指向了未知内存,*p的值是乱码(可能是任意数,取决于内存情况)。

所以第一个输出是 10,第二个输出是不确定的乱码。很多人会误以为第二个输出是 11,其实不是,p++移动的是指针,不是改变a的值。记住:指针的 ++ 是地址变,不是值变。


高频题三:函数指针,怎么调用才对?


题目:如何通过函数指针调用下面的 add 函数?
c运行
int add(int a, int b) {return a + b;}

函数指针是面试高频考点,尤其是嵌入式岗位,考的概率特别大。
解题步骤
  1. 先定义函数指针:函数指针的格式是 “返回值类型 (* 指针名)(参数类型)”,所以 add 的指针应该是int (*p)(int, int);
  2. 让指针指向函数:p = add;(注意不用 &,函数名本身就是地址)。
  3. 调用方式:有两种,(*p)(2, 3)或者p(2, 3),两种都对,结果都是 5。

很多新手会把函数指针定义写成int *p(int, int);,这就错了,这是声明一个返回 int * 的函数,不是指针。必须加括号(*p),这点一定要记牢。


高频题四:野指针和空指针,区别在哪?


面试官可能会问:“野指针和空指针有啥区别?怎么避免野指针?”
这题考的是指针的基础概念,看似简单,答不全就会扣分。
解题思路
  • 空指针是明确指向 NULL 的指针,比如int *p = NULL;,NULL 其实是 0,访问会报错但不会乱改内存。
  • 野指针是指向未知地址的指针,比如int *p;没初始化就用,或者free(p)后没置空,这时候访问可能崩溃,也可能改了不该改的内存,特别危险。

避免野指针的方法:
  1. 定义指针时马上初始化,要么指向变量,要么设为 NULL。
  2. free 后立即p = NULL;
  3. 函数参数传递指针时,先检查是否为 NULL。



易错点对比表


考点常见错误正确做法
指针数组 vs 数组指针int *arr[5]当成数组指针int *arr[5]是指针数组(存指针的数组),int (*p)[5]是数组指针(指向数组的指针)
二级指针传参想用一级指针接收二级指针的值传二级指针必须用二级指针接收,比如void func(int **p)
指针常量 vs 常量指针分不清int *const pconst int *pint *const p:指针不能改,指向的值能改;const int *p:指向的值不能改,指针能改



可能有人会问,这些题看着不难,为啥面试时总答错?其实啊,不是难在知识点,是难在细节。比如指针运算那题,很多人知道后置 ++,但一紧张就忘了指针移动后指向的是未知内存。
兔子哥面试的时候,就被问过函数指针的题,当时把定义写错了,好在面试官提醒,才反应过来。后来总结出个规律:指针题不管怎么变,都离不开 “地址” 和 “值” 的关系,抓住这一点,再复杂的题也能拆解开。
准备面试的时候,别只背答案,多动手写代码试试。比如数组指针那块,自己敲一遍int (*p)[3] = arr;,打印几个值,比死记硬背强多了。面试时遇到不会的,也别慌,把自己能想到的思路说出来,面试官有时候看的不是答案,是你的分析过程。希望这些能帮到你,祝你面试顺利!

标签: 一团乱麻 面试题

上一篇当前分类已是最后一篇

下一篇c语言语法实战案例教程,从代码编写到运行全解析

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~