c语言编程面试:10道高频指针题的解析与编程思路

admin C语言 7


你是不是也听说过,C 语言面试里指针题是 “必考点”,很多人栽在上面?明明平时过指针,可一到面试题就懵,要么分不清指针和数组的关系,要么写代码时野指针满天飞。其实啊,高频指针题就那么几种,搞懂思路比死记硬背管用。今天兔子哥就带你过 10 道高频题,解析思路和易错点,面试遇到了也不怕,一起往下看吧!

1. 指针和数组名有啥不一样?


题目大概是这样:int a[5], *p=a;ap有啥区别?很多人觉得差不多,其实不一样。
解析:a是数组名,代表数组首地址,但它是 “常量指针”,不能自增自减(比如a++是错的);p是指针变量,能改指向(p++没问题)。
为啥考这个?因为面试常考数组和指针的关系,很多人搞混两者的可修改性。

2. 指针自增,地址跳多少?


题目:int *p; char *q;p++q++后,地址分别加几?
解析:指针自增的步长是它指向的数据类型的大小。int占 4 字节(大部分情况),所以p++地址加 4;char占 1 字节,q++地址加 1。
易错点:有人以为不管啥指针,自增都加 1,这是错的,步长跟类型决定。
指针类型自增步长(通常)例子
int*4 字节p++ 后地址 + 4
char*1 字节q++ 后地址 + 1
double*8 字节d++ 后地址 + 8

3. 这样写为啥会崩溃?(野指针问题)


题目:int *p; *p=10; 运行会咋样?
解析:p没初始化,是野指针,指向随机地址,往*p=10就是往随机内存写数据,大概率崩溃。
怎么避免避免?用指针前必须让它指向有效内存,比如int a; int *p=&ap=(int*)malloc(sizeof(int));

4. 函数里改指针,为啥外面没变?


题目:写个函数交换两个指针的值,结果没交换成功,咋回事?
比如:
c运行
void swap(int *a, int *b) {int *temp = a;a = b;b = temp;}

解析:函数传的是指针的副本,在函数里改副本,外面的指针没变。得用二级指针才行:
c运行
void swap(int **a, int **b) {int *temp = *a;*a = *b;*b = temp;}

很多人忘了指针也是值传递,这题能筛掉不少基础不牢的。

5. 指针数组和数组指针,怎么区分?


题目:int *p[5]int (*p)[5]各是啥?
解析:int *p[5]是指针数组,数组里装了 5 个 int * 指针;int (*p)[5]是数组指针,指向一个有 5 个 int 的数组。
记不住?看优先级,[]*高,所以p[5]先结合,就是数组,再*就是指针数组;加括号(*p),就是指针,指向数组。

6. 字符串指针赋值后,能改内容吗?


题目:char *str="abc"; str[0]='A'; 会咋样?
解析:"abc"是常量字符串,存在只读内存,用char *指向它,改内容会崩溃。得用char str[]="abc"; 这样存在栈上,才能改。
易错点:很多人分不清字符串常量和字符数组的区别,这题一考就暴露。

7. 动态分配的内存,忘了 free 会咋样?


题目:int *p=(int*)malloc(4); 用完没free(p); 有啥问题?
解析:会内存泄漏,程序跑久了,没释放的内存越来越多,可能卡崩。面试常问怎么避免?记住 “谁申请谁释放”,malloc 和 free 成对出现,释放后最好p=NULL; 防止野指针。

8. const 和指针结合,有几种情况?


题目:const int *pint *const p有啥区别?
解析:const int *p是指针指向的内容不能改(*p=10错),但指针能改指向(p=&a行);int *const p是指针本身不能改指向(p=&a错),但内容能改(*p=10行)。
记法:const 在*前,内容不能改;const 在*后,指针不能改。

9. 用指针遍历数组,怎么写才对?


题目:用指针遍历int a[5]={1,2,3,4,5},打印所有元素。
正确写法:
c运行
int *p;for(p=a; p<a+5; p++) {printf("%d ", *p);}

易错点:有人写成p<=&a[4],虽然也行,但a+5更简洁,这是面试加分项。

10. 链表的头插法,指针咋操作?


题目:给链表头指针head,插入新节点node,头插法代码咋写?
解析:头插法要让新节点指向原来的头,再更新头指针:
c运行
node->next = head;head = node;

很多人忘了更新head,导致插入后找不到新节点,这是链表操作的基础坑。
可能有人会问,这些题真的常考吗?兔子哥面过几家公司,至少遇到过 6 道,尤其是野指针、指针与数组、动态内存这些,几乎是必问。其实啊,指针题看着难,拆解开来就是 “指向谁、能不能改、步长多少” 这几个点。
准备的时候,别只看代码,多动手写,写错了就调试,看看内存地址怎么变的。比如指针自增,打印一下前后的地址,就知道步长是多少了。面试时遇到不会的,也别慌,按 “先分析指针指向,再看操作影响” 的思路说,面试官更看重你的思考过程。
我当年准备的时候,把这些题抄在本子上,每天过一遍,一周就熟了。指针确实是 C 语言的难点,但搞定这些高频题,面试底气能足不少,真的。

标签: 面试题 不一样

发布评论 0条评论)

  • Refresh code

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