版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言指针高频面试题及详细答案(真实面试版)本套题目精选企业笔试、面试高频指针考点,涵盖基础概念、指针运算、野指针、二级指针、数组指针、函数指针、指针易错代码分析等核心内容,答案通俗易懂、贴合工程实战,无书面化空洞讲解。一、基础概念面试题(入门必问)1.简述指针的本质,指针变量和普通变量的区别?答案:指针的本质是存储内存地址的变量。普通变量存储的是数据本身(int存整数、char存字符),而指针变量存储的是另一个变量的内存编号(地址)。核心区别:普通变量:取值直接用变量名,操作的是数据值;指针变量:存储地址,通过解引用(*)才能操作地址对应的实际数据;在32位系统中,所有指针变量大小都是4字节;64位系统中都是8字节,和指向的数据类型无关。2.&和*运算符分别是什么作用?优先级和结合性如何?答案:&取地址符:作用是获取变量的内存地址,只能作用于变量、数组元素,不能作用于常量、表达式;*解引用符(取值符):作用是根据指针地址,取出对应内存中的数据,只能作用于指针(有效地址)。优先级:&和*优先级相同,结合性为自右向左。示例:*&a等价于a,先取a的地址,再通过地址取值,还原变量本身。3.空指针NULL是什么?空指针和未初始化的指针有什么区别?答案:NULL是C语言定义的宏,本质是(void*)0,代表地址为0的无效内存地址。空指针就是赋值为NULL的指针。核心区别:空指针(NULL):指针变量有明确值(地址0),人为初始化,可判断,不会随意访问内存;未初始化指针:指针变量存储随机垃圾地址,也就是野指针,地址未知、不可预判,直接解引用会导致程序崩溃、段错误。工程规范:所有指针使用前必须初始化,不用的指针主动置为NULL。4.什么是野指针?野指针的成因及如何规避?答案:野指针指指向未知、非法、不可操作内存的指针,没有合法有效的指向地址。常见成因:指针定义后未初始化,存储随机地址;指针指向的内存释放(free)后,未置空,指针变成悬空指针(野指针的一种);指针越界访问数组、栈内存。规避方法:指针定义时直接初始化(指向变量或NULL);动态内存free之后,立即将指针置为NULL;使用指针前先判断是否为NULL;严格控制指针偏移,避免数组、内存越界。二、指针运算高频题(笔试重点)5.指针的加减运算和普通变量加减有什么区别?答案:普通变量加减是数值直接加减,指针加减是按指向的数据类型跨度偏移地址。公式:指针新地址=原地址±n*指向类型所占字节数举例(32位系统):int*p;p++:地址偏移4字节(一个int大小);char*p;p++:地址偏移1字节(一个char大小);double*p;p++:地址偏移8字节。注意:指针只能加减整数,不能乘除;两个同类型指针可以相减,结果是元素个数,不能相加。6.两段代码输出结果是什么?为什么?(指针偏移经典题)PlainText
//代码1
inta[5]={1,2,3,4,5};
int*p=a;
printf("%d\n",*(p+1));
//代码2
char*q=(char*)a;
printf("%d\n",*(q+1));
答案:输出结果:2、0解析:代码1:p是int类型指针,p+1偏移4字节,指向数组第二个元素,取值为2;代码2:强制转为char指针,q+1只偏移1字节。int占4字节,第一个int1的内存高3字节都是0,因此取到的值为0。三、二级指针、数组指针高频题(面试核心)7.什么是二级指针?二级指针的使用场景?答案:二级指针是指向一级指针变量的指针,定义格式:int**p;。一级指针存数据地址,二级指针存一级指针的地址。核心使用场景:函数内修改一级指针的值:普通传参是值传递,函数内无法修改外部指针指向,传入二级指针即可修改外部一级指针地址;操作字符串数组、二维数组指针;动态申请二维内存。8.区分:int*p[]和int(*p)[]的区别?(90%面试必问)答案:核心口诀:括号优先级高于[]int*p[]:指针数组。本质是数组,数组的每个元素都是int类型指针。常用于存放多个字符串。int(*p)[]:数组指针。本质是指针,专门指向固定列数的二维数组,指针偏移以整个数组为单位。最简区分:看括号,带括号是指针,不带括号是数组。9.区分:int*fun()和int(*fun)()的区别?答案:int*fun():返回值为int指针的函数。函数执行完返回一个整型地址;int(*fun)():函数指针。本质是指针,指向一个“参数为空、返回值为int”的函数,可用于回调函数、函数数组。四、指针易错代码分析(改错/结果判断)10.下面代码有什么问题?PlainText
voidtest()
{
inta=10;
int*p=&a;
free(p);
}
答案:严重错误,程序崩溃。解析:free只能释放malloc/calloc/realloc动态申请的堆内存。变量a是栈内存,栈内存由系统自动分配、自动释放,手动free栈地址会破坏内存布局,触发段错误。11.下面代码输出多少?为什么?PlainText
char*str="hello";
str[0]='H';
printf("%s\n",str);
答案:程序崩溃(段错误)。解析:"hello"是字符串常量,存储在只读数据段,不允许修改。指针str指向只读内存,尝试写操作会触发内存保护错误。修正:用数组存储字符串charstr[]="hello";,存储在栈区,可读写。12.分析以下指针传参问题(经典考题)PlainText
voidgetAddr(int*p)
{
intb=100;
p=&b;
}
intmain()
{
inta=10;
int*p=&a;
getAddr(p);
printf("%d\n",*p);
return0;
}
答案:输出结果:10解析:C语言参数传递是值传递。函数内的p是形参,是外部指针的临时拷贝,修改的是临时指针的指向,不会影响main函数中原始指针的指向。如果需要在函数内修改外部指针指向,需要传入二级指针:PlainText
voidgetAddr(int**p)
{
intb=100;
*p=&b;
}
五、压轴综合面试题(高阶考点)13.const修饰指针的三种形式及区别?答案:口诀:const修饰谁,谁就不能改constint*p:修饰*p。指针指向的数据不可修改,指针本身地址可以改;int*constp:修饰p。指针本身地址不可修改,指向的数据可以改;constint*constp:同时修饰p和*p。指针地址、指向的数据都不可修改。14.指针数组和二维数组的区别?能否互相强制转换?答案:1.内存结构不同:二维数组:内存连续整块存储,所有元素紧挨在一起;指针数组:数组里存的是指针,每个指针指向的内存可以不连续。2.类型不同,不建议强制转换:二维数组名是数组指针类型,指针数组是指针数组类型,强制转换后指针偏移规则错乱,极易出现越界、取值错误。15.悬空指针和野指针的细微区别?答案:很多场景会统称,但严格区分有差异:野指针:泛指所有非法未知指针,主要是未初始化、随机地址;悬空指针:指针原本指向合法内存,内存释放/销毁后,指针保留旧地址,变成无效指针。共同点:都不能解引用,必须置空规避风险。六
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026传染病食源性疾病考核试题及答案
- 2026出租车从业资格证考试题库及答案
- 2026国家电投集团校园招聘笔试历年参考题库附带答案详解
- 初中物理九年级上册4.1电流教学设计
- 2026年(农业机械化及其自动化)农业机械选型试卷及答案
- 高三英语外研版必修一 Unit 4 Friends forever 语基默写一轮复习教学设计
- 高中体育跳跃三级跳远教学设计
- 2026年安全工程师《安全生产技术基础》测题库及答案
- 2026年cpa注册会计师税法题库试题附答案
- 2026年安全责任制落实培训试题(附答案)
- 脑出血患者的呼吸道管理与吸痰技巧
- 呼吸困难及窒息患者的急救护理
- 江苏省苏豪控股集团有限公司招聘笔试题库2026
- 码头装卸协议书简单
- 国企招聘笔试题及答案-投资专员、投资经理A卷
- 2024苏教版三年级科学上册全册单元测试(含解析)
- 鄂尔多斯市国有资产投资控股集团有限公司招聘笔试真题2024
- 辅导员工作岗位知识培训课件
- 地产尾盘培训知识课件
- DR体位操作技术规范与临床应用
- 一次性医疗用品管理课件
评论
0/150
提交评论