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

下载本文档

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

文档简介

C语言指针高频面试题及详细答案(实战干货版)本套面试题适配校招、初级开发面试,由浅入深,包含基础概念、易错坑点、代码输出分析、指针进阶、数组指针、函数指针、野指针等核心考点,答案贴合企业面试答题逻辑,无冗余话术。一、基础概念题1.简述指针的本质是什么?指针变量和普通变量的区别?参考答案:指针的本质是存储内存地址的变量。系统会给计算机内存中每个字节空间分配唯一的编号,这个编号就是内存地址,指针就是用来存放这个地址的。区别主要有三点:1.存储内容不同:普通变量存储的是数据值(int存整数、char存字符),指针变量存储的是其他变量的内存地址;2.取值方式不同:普通变量直接取值即可,指针变量需要通过解引用(*)操作,才能取出地址对应的实际数据;3.用途不同:普通变量用于存储业务数据,指针主要用于间接访问数据、操作动态内存、传递函数参数、操作数组和字符串。2.&和*运算符分别是什么作用?优先级和结合性如何?参考答案:&是取地址符,作用是取出变量的内存地址;*是解引用符(取值符),作用是根据指针地址,取出该地址中存储的数据。两者优先级相同,均为单目运算符,结合性为自右向左。举例:*&a等价于a,先取a的地址,再通过地址取值,最终还原变量本身。3.空指针NULL和野指针的区别?各自如何产生?怎么规避?参考答案:空指针(NULL):指赋值为0的指针,标准定义为#defineNULL((void*)0),代表指针不指向任何有效内存空间。产生方式:主动给指针赋值NULL,如int*p=NULL;特点:空指针是合法指针,系统不会允许访问0地址内存,对空指针解引用会触发程序崩溃,日常主要用于指针初始化、判断指针是否有效。野指针:指向随机、未知、不受管控内存空间的指针,没有明确指向。产生原因:1.指针未初始化,局部指针变量默认是随机垃圾值;2.指针指向的内存释放后,未置空,指针变成悬空指针(野指针的一种);3.指针越界访问,超出变量/数组的内存范围。特点:野指针是非法指针,访问野指针大概率造成程序闪退、内存错乱、偶现bug,且问题难以排查。规避方案:1.所有指针定义时主动初始化为NULL;2.动态内存free释放后,立即将指针置为NULL;3.使用指针前先判断if(p!=NULL),杜绝空指针和解引用野指针;4.严格控制数组、指针的访问范围,避免越界。二、易错基础代码题4.分析以下代码的输出结果,并说明原因PlainText

#include<stdio.h>

intmain()

{

inta=10;

int*p=&a;

*p=20;

printf("a=%d\n",a);

return0;

}参考答案:输出结果:a=20解析:p存储了变量a的内存地址,*p代表直接操作a地址对应的内存数据。通过解引用指针修改值,本质是修改了原变量a的内存内容,因此a的值会从10变为20。这也是指针可以跨作用域修改变量的核心原理。5.分析代码错误点(经典传参坑题)PlainText

#include<stdio.h>

voidgetAddr(int*p)

{

intb=100;

p=&b;

}

intmain()

{

inta=10;

int*p=&a;

getAddr(p);

printf("%d\n",*p);

return0;

}参考答案:输出结果:10,代码无编译报错,但逻辑错误,无法修改主函数指针指向。错误原因:C语言函数传参是值传递。调用getAddr时,只是把p中存储的地址值拷贝给形参p,函数内部修改的是形参指针变量的指向,和主函数的实参指针无关。函数调用结束后,形参销毁,主函数p的指向不变,依旧指向变量a。修正方案:需要修改指针本身的指向时,必须传递二级指针,函数形参改为int**p。三、指针与数组核心考点6.数组名和指针的区别?为什么数组名不能直接赋值?参考答案:很多场景下数组名可以当做指针使用,但两者本质完全不同:1.本质不同:数组名是数组首元素的地址常量,指针是存储地址的变量;2.是否可修改:指针变量可以随意更改指向(p++、p=xxx),数组名是常量,不允许赋值、自增自减,arr++、arr=NULL都会编译报错;3.sizeof结果不同:sizeof(数组名)计算的是整个数组的内存总大小,sizeof(指针)永远是4字节(32位系统)/8字节(64位系统);4.存储方式不同:数组是连续的内存空间,指针是独立的变量,仅存储地址。7.分析sizeof(arr)、sizeof(p)、strlen(arr)、strlen(p)的区别PlainText

#include<stdio.h>

#include<string.h>

intmain()

{

chararr[]="hello";

char*p=arr;

printf("%d%d%d%d\n",sizeof(arr),sizeof(p),strlen(arr),strlen(p));

return0;

}参考答案:64位系统输出:6855解析:1.sizeof(arr):数组真实长度,包含末尾'\0'结束符,5个字符+1个结束符,共6字节;2.sizeof(p):指针变量本身的大小,64位系统固定8字节,和指向内容无关;3.strlen只统计有效字符长度,不计算'\0',因此结果都是5;核心考点:strlen依靠'\0'判断结束,sizeof是编译期计算内存大小。8.指针加减运算的规则是什么?p+1跳过多少字节?参考答案:指针的加减运算不是单纯的地址数值加减,而是以指向数据类型的大小为步长进行偏移。规则:p+n等价于原地址+n*sizeof(指针指向类型)举例:1.int*p;p+1偏移4字节(int占4字节);2.char*p;p+1偏移1字节(char占1字节);3.double*p;p+1偏移8字节(double占8字节)。这也是指针可以遍历数组的核心原因,每次+1精准跳到下一个数组元素。四、二级指针与指针数组9.什么是二级指针?二级指针的使用场景有哪些?参考答案:二级指针是指向一级指针变量的指针,定义格式:int**p。一级指针存储普通变量地址,二级指针存储一级指针变量的地址。核心使用场景:1.函数内部修改实参指针的指向(解决前文指针传参无法修改指向的问题);2.操作指针数组,遍历多个字符串;3.动态申请二维内存。10.指针数组和数组指针的区别?(高频必考)参考答案:核心口诀:看括号,优先级不同,[]优先级高于*。1.指针数组:char*arr[5];本质是数组,数组的每个元素都是char类型指针,用于存放多个字符串地址,常用于存储字符串数组;sizeof(arr)=5*指针大小。2.数组指针:char(*p)[5];本质是指针,专门指向一个包含5个char元素的数组,多用于二维数组遍历;sizeof(p)=指针本身大小。极简区分:带括号的是指针,不带括号的是数组。五、函数指针与进阶考点11.什么是函数指针?作用是什么?参考答案:函数指针是指向函数代码地址的指针。函数在内存中会占用代码段空间,有专属地址,函数指针就是用来存储这个地址的。定义格式:返回值类型(*指针名)(参数列表);示例:int(*fp)(int,int);核心作用:1.实现函数回调,多用于结构体封装、插件开发;2.实现多态逻辑,通过切换函数指针,动态调用不同函数;3.减少代码冗余,简化分支判断逻辑。12.const修饰指针的三种情况及区别参考答案:1.constint*p:常量指针,指针指向的值不可改,指针的指向可以改;不能*p=100,但可以p=NULL。2.int*constp:指针常量,指针的指向不可改,指向的值可以改;不能p=NULL,但可以*p=100。3.constint*constp:双重常量,指向和值都不可修改,全程只读。记忆技巧:const靠近谁,谁就不可修改。六、综合改错面试题13.找出以下代码的所有错误并修正PlainText

#include<stdio.h>

intmain()

{

char*str="test";

str[0]='T';

printf("%s\n",str);

return0;

}参考答案:错误原因:字符串常量"test"存储在只读代码段,不允许修改。指针str指向只读内存,尝试修改只读内存会触发程序崩溃。修正方案:将字符串存储到栈区数组中,栈区内存可读写:PlainText

charstr[]="test";

str[0]='T';14.动态内存指针常见错误:分析代码问题PlainText

#include<stdio.h>

#include<stdlib.h>

voidtest()

{

int*p=(int*)malloc(4);

free(p)

温馨提示

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

评论

0/150

提交评论