你是不是也听说过,C 语言面试里指针题是 “必考点”,很多人栽在上面?明明平时过指针,可一到面试题就懵,要么分不清指针和数组的关系,要么写代码时野指针满天飞。其实啊,高频指针题就那么几种,搞懂思路比死记硬背管用。今天兔子哥就带你过 10 道高频题,解析思路和易错点,面试遇到了也不怕,一起往下看吧!
1. 指针和数组名有啥不一样?
题目大概是这样:
int a[5], *p=a; 问a和p有啥区别?很多人觉得差不多,其实不一样。解析:
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=&a 或p=(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 *p和int *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 语言的难点,但搞定这些高频题,面试底气能足不少,真的。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~