c语言指针面试题汇总:含解析与答题思路,求职必看

admin C语言 7


准备找编程相关工作的你,是不是一想到面试要考 C 语言指针就头大?听说好多人简历写着 “精通 C 语言”,结果被面试官一个指针问题问得哑口无言。其实啊,指针面试题看着难,摸清套路了一点都不难。今天兔子哥就给你汇总几道高频指针面试题,带着解析和答题思路,求职的朋友可得好好看看,一起往下看吧!
指针和数组名到底啥关系?这题几乎是面试必问。有人说 “数组名就是指针”,这话对吗?不全对。咱们看个例子:
c运行
int arr[5] = {1,2,3,4,5};int *p = arr;

这里 arr 确实能当指针用,p = arr 和 p = &arr [0] 效果一样。但你用 sizeof 试试,sizeof (arr) 算出来是 20(假设 int 占 4 字节),而 sizeof (p) 是 4 或 8,这说明数组名和指针在内存占用上不一样。
答题思路得这么说:数组名在大多数时候会被隐式转换成指向首元素的指针,但它不是真正的指针。比如在 sizeof、取地址(&arr)这些场景下,数组名代表整个数组。面试官就想考你知不知道这个 “大多数时候” 之外的情况。


函数参数用指针和不用指针,区别在哪?面试官常拿这个考你对传参的理解。比如写个交换函数,为啥用 int * 就能成,用 int 就不行?
这其实是值传递和地址传递的区别。用 int 的话,函数里拿到的是变量的副本,改副本不会影响原来的变量;用 int * 传的是地址,函数里能直接找到原变量的内存,改了就真的变了。
答题时别忘了举例子,比如:
c运行
// 失败的交换void swap(int a, int b) { int t=a; a=b; b=t; }// 成功的交换void swap_ptr(int *a, int *b) { int t=*a; *a=*b; *b=t; }

重点要说清楚:指针让函数能操作外部变量的内存,普通参数只能操作副本。面试官可能还会追问,那什么时候必须用指针当参数?你就说需要修改外部变量,或者传递大型数据(比如数组)时省内存。


野指针是怎么产生的?怎么避免?这题考的是你写代码的规范性,面试官怕你写的程序到处是隐患。
野指针产生的原因主要有三个:
  1. 指针定义了没初始化,比如 int *p; 这时候 p 里是随机地址
  2. 指针指的内存被 free 了,还接着用
  3. 指针越界,比如访问数组外的地址

避免方法也对应这几点:
  • 定义时就初始化,要么指向变量,要么设为 NULL,比如 int *p = NULL;
  • free 后马上把指针设为 NULL,比如 free (p); p = NULL;
  • 操作数组时严格检查边界,别让指针跑出去

有个朋友面试时被问 “野指针和空指针的区别”,他没答上来。其实空指针是明确指向 NULL 的,野指针是指向无效地址,这俩完全不一样。


函数指针是啥?怎么用?这题能看出你对指针理解深不深。函数指针就是指向函数的指针,听起来绕,其实用法很简单。
比如:
c运行
int add(int a, int b) { return a + b; }// 定义函数指针int (*func_ptr)(int, int) = add;// 调用int result = func_ptr(3, 5); // 结果是8

答题思路要包括:函数指针的定义格式(返回类型 (* 指针名)(参数类型))、用途(比如回调函数)。面试官可能会问 “函数指针有啥用”,你可以说在实现回调机制时特别方便,比如 qsort 函数里就用到了。


指针数组和数组指针,这俩名字差不多,咋区分?好多人在这栽跟头。其实看名字就能分清,指针数组是 “指针的数组”,数组里装的是指针;数组指针是 “指向数组的指针”,它指向一个数组
看代码对比:
类型定义含义
指针数组int *arr[5];有 5 个元素的数组,每个元素是 int * 指针
数组指针int (*p)[5];指向一个 “有 5 个 int 元素的数组” 的指针

面试时可以画个图,或者说清楚优先级:[] 比 * 高,所以 int *arr [5] 先结合 [],是数组;加了括号后,(p) 先结合,是指针。


可能有人会问,面试时被问到不会的指针题咋办?兔子哥觉得,不会就直说 “这个问题我不太清楚,但我可以说说我的理解”,千万别瞎编。面试官更看重你的思路,而不是死记硬背的答案。
我当年面试时,被问到 “二级指针怎么操作二维数组”,一时没答上来,就坦诚说了不会,但接着说了我对一级指针和一维数组的理解,面试官还挺认可的。
其实指针面试题万变不离其宗,无非就是指针与数组、函数、内存的关系。把这些基础搞透了,再难的题也能说出个一二三。平时多写代码,遇到指针错误别逃避,调试明白了就是进步。
最后想跟求职的朋友说,指针是 C 语言的灵魂,也是面试的重点,花时间吃透绝对值得。面试前把这些题过一遍,理解思路比背答案重要。祝你面试顺利,拿到心仪的 offer!

标签: 哑口无言 面试题

发布评论 0条评论)

  • Refresh code

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