C语言指针高频面试题及详细答案(实战版)_第1页
C语言指针高频面试题及详细答案(实战版)_第2页
C语言指针高频面试题及详细答案(实战版)_第3页
C语言指针高频面试题及详细答案(实战版)_第4页
C语言指针高频面试题及详细答案(实战版)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言指针高频面试题及详细答案(实战版)一、指针基础概念面试题1.什么是指针?指针和指针变量的区别?答案:指针本质就是内存地址,是数据在内存中存储的位置编号,是一个常量概念。指针变量是专门用来存储内存地址的变量,是一个可修改的变量。我们平时代码中写的int*p是指针变量,日常口语中简称指针。简单总结:指针=内存地址(数值)指针变量=存放地址的变量(可读写)2.*和&符号分别代表什么含义?答案:&:取地址符,作用是获取变量的内存地址,只能作用于变量,不能作用于常量和表达式。*:两种用法:

定义变量时:int*p,表示定义一个指针变量;使用变量时:*p,表示解引用,取出指针地址中存储的实际数据。3.指针变量的大小是多少?和什么有关?答案:指针变量的大小和存储的数据类型无关,只和系统架构有关。32位系统:所有指针大小都是4字节64位系统:所有指针大小都是8字节不管是int*、char*、double*,指针本身大小完全一致,区别仅在于解引用时读取的字节数不同。二、指针易错基础面试题(笔试高频)4.char*p和int*p核心区别是什么?答案:核心区别是指针步长和解引用读取的字节数不同:char*:步长1字节,p+1地址+1,解引用读取1字节数据;int*:步长4字节,p+1地址+4,解引用读取4字节数据;指针类型的作用:决定指针移动步长、决定解引用读取内存的字节数。5.空指针、野指针、悬空指针的区别?各自危害?答案:(1)空指针NULL值为0的指针,不指向任何有效内存。C语言中NULL本质是宏定义#defineNULL((void*)0)。特点:安全,可判断、可初始化,禁止对空指针解引用,会触发段错误。(2)野指针未初始化、指向随机未知内存地址的指针。危害:极度危险,随机访问内存,会导致程序崩溃、内存踩踏、未知bug,且bug极难复现排查。常见场景:局部指针变量未初始化、指针越界。(3)悬空指针指针原本指向有效内存,后续内存被释放、销毁,但指针变量未置空,依然保留原地址。危害:再次使用该指针会访问已释放的内存,造成内存非法访问、程序崩溃。规避方案:内存释放后,立刻将指针置为NULL。6.void*空类型指针的作用和特点?答案:void*是通用指针,可以接收任意类型数据的地址,常用于内存通用操作,比如malloc、memcpy函数。特点:无法直接解引用,编译器不知道该读取几个字节;不支持指针加减运算,无固定步长;使用时必须强制转换成对应数据类型指针。三、常量指针与指针常量(必考区分)7.constint*p、int*constp、constint*constp区别?核心口诀:左定值、右定址(1)constint*p常量指针const修饰的是*p,表示指针指向的值不可修改,但指针本身的地址可以修改。适用场景:只读数据,防止通过指针修改原变量值。(2)int*constp指针常量const修饰的是p,表示指针本身的地址不可修改,但可以修改指针指向的值。适用场景:指针地址固定,只修改指向内容。(3)constint*constp地址和指向的值都不可修改,完全只读。四、数组指针、指针数组高频题8.指针数组和数组指针的区别?(面试必问)答案:(1)指针数组int*p[5]本质是数组,数组的每个元素都是int类型指针。优先级:[]高于*,先结合数组,再结合指针。用途:常用于存储多个字符串、多个数组地址。(2)数组指针int(*p)[5]本质是指针,专门指向一个包含5个int元素的数组。括号改变优先级,p先和*结合为指针,再指向数组。用途:常用于二维数组遍历、二维数组传参。9.二维数组传参为什么推荐用数组指针?答案:二维数组在传参时会退化,无法直接用二级指针int**接收。因为二维数组是连续内存存储,每行元素连续,而二级指针是指针数组,存储的是零散的指针地址。正确传参方式:int(*p)[列数],可以精准匹配二维数组的内存结构,实现正常遍历。五、函数指针、二级指针面试题10.二级指针int**p的使用场景?答案:二级指针是指向指针的指针,核心使用场景:指针变量传参修改:函数内部修改外部一级指针的值(比如动态内存分配、指针重置);指针数组遍历:配合指针数组使用;字符串数组操作。重点:普通二维数组不用二级指针,只有指针数组才用二级指针接收。11.什么是函数指针?用途是什么?答案:函数指针是指向函数的指针,存储的是函数的代码段入口地址。定义格式:返回值类型(*指针名)(参数列表)示例:int(*p)(int,int)核心用途:实现回调函数;实现多态、分层解耦;跳转表、状态机设计。六、代码改错、结果分析题(笔试压轴)12.下面代码有什么问题?c

char*str="hello";

*str='H';答案:代码报错,触发内存访问错误。原因:"hello"是字符串常量,存储在只读数据段,不允许修改。指针str指向只读内存,通过解引用修改内容会程序崩溃。修正:用字符数组存储charstr[]="hello";,数组内存位于栈区,可读写。13.下面函数存在什么严重bug?c

int*getAddr()

{

inta=10;

return&a;

}答案:存在悬空指针bug。变量a是局部变量,存储在栈区,函数执行结束后,栈帧销毁,变量a的内存会被释放回收。此时返回的地址是无效地址,外部调用该指针会访问非法内存,数据错乱、程序崩溃。解决:将a定义为static静态变量,存储在静态区,函数结束后内存不释放。14.p++和(*p)++的区别?答案:p++:指针地址向后偏移一个类型步长,指针本身移动;(*p)++:先解引用取出p指向的值,将数值+1,指针地址不发生任何变化。七、面试口述综合题(面试官常问)15.指针和数组的关系?数组名是什么?答案:数组名在绝大多数场景下会退化为数组首元素的地址,本质是常量指针,不可以自增、自减、赋值修改。两个例外场景数组名不会退化:sizeof(数组名):计算整个数组的总字节数;&数组名:取出整个数组的地址。同时a[i]本质等价于*(a+i),这也是数组可以用指针遍历的核心原理。16.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论