C语言面试题及答案.docxVIP

  • 0
  • 0
  • 约7.01千字
  • 约 8页
  • 2026-03-12 发布于河北
  • 举报

C语言面试题及答案

一、基础语法类

1.简述C语言中char类型的取值范围,为什么是这个范围?

答案:默认情况下(多数编译器,如GCC、VC),char是有符号类型(signedchar),取值范围是-128~127;若显式声明为unsignedchar,取值范围是0~255。

核心原因:char类型占用1个字节(8位),有符号时最高位是符号位(0表示正数,1表示负数),剩下7位表示数值,最大正数127),负数用补码表示,最小负数-128,补码换算后对应十进制-128);无符号时8位全用于表示数值,最大255)。

2.说说C语言中static关键字的三种用法及作用

答案:static在C语言中有三个核心用法,分别对应不同场景:

1.修饰局部变量:将局部变量的存储位置从栈区移到静态数据区,生命周期延长至整个程序运行结束,初始化一次(默认初始化为0),作用域仍局限于所在函数/代码块,函数退出后变量值不丢失。

2.修饰全局变量:限制全局变量的作用域仅当前源文件(.c文件),其他源文件无法通过extern声明引用该变量,避免全局变量命名冲突。

3.修饰函数:将函数的作用域限制在当前源文件,其他源文件无法调用该函数(类似“私有函数”),同样是为了隔离作用域、减少冲突。

3.什么是宏定义?宏和函数的区别是什么?

答案:宏定义(#define)是预处理指令,用于将一个标识符替换为指定字符串(或表达式),预处理阶段直接进行文本替换,不做语法检查。

宏和函数的核心区别:

-执行阶段:宏在预处理阶段替换,函数在运行阶段调用;

-开销:宏无调用开销(直接替换),但可能产生冗余代码;函数有压栈、跳转、返回的开销;

-类型检查:宏不做类型检查,任何类型都能替换(可能出问题);函数有明确的参数和返回值类型检查;

-灵活性:宏可实现简单的代码片段替换(如交换两个数),不受参数类型限制;函数参数类型固定,需适配不同类型需重载(C语言无原生重载,需手动写不同名函数)。

示例:#defineSWAP(a,b){inttemp=a;a=b;b=temp;}是宏,swap(inta,intb)是函数。

二、指针与数组类

1.数组名和指针的区别是什么?为什么数组名有时能当作指针用?

答案:核心区别:数组名是“数组首元素地址的常量”(不可修改,如a++非法),指针是“存放地址的变量”(可修改,如p++合法);数组名代表整个数组时(如sizeof(a)),计算的是整个数组的字节大小,而指针sizeof(p)计算的是指针变量本身的大小(32位系统4字节,64位8字节)。

数组名能当作指针用的原因:C语言语法规定,数组名在大多数场景下会“隐式转换”为指向数组首元素的指针(地址值相同),比如数组访问a[i],本质是*(a+i),这里a就被转换为指针,通过偏移量i访问元素;再比如把数组名传给函数参数时,函数接收的其实是指针,而非整个数组(所以函数内sizeof(参数名)得到的是指针大小)。

示例:inta[5];int*p=a;这里a隐式转为a[0],p存放首元素地址,a[i]和p[i]等价,但a不可自增,p可以。

2.什么是野指针?如何避免野指针问题?

答案:野指针是指向“无效地址”的指针(比如未初始化、指向已释放内存、指向越界内存的指针),访问野指针会导致程序崩溃、内存异常(未定义行为)。

避免野指针的3个核心措施:

1.指针初始化:定义指针时要么指向合法内存(如inta=10;int*p=a;),要么初始化为NULL(int*p=NULL;),禁止定义无初始化的指针(int*p;非法,p的值随机,是野指针);

2.指针释放后置空:用free()释放指针指向的动态内存后,立即把指针设为NULL(free(p);p=NULL;),避免后续误访问已释放的内存;

3.避免指针越界:数组访问、内存操作时严格检查边界(如循环遍历数组时,索引不超过数组长度-1),不访问超出内存范围的地址。

3.用指针实现数组逆序(比如输入[1,2,3,4,5],输出[5,4,3,2,1])

答案:核心思路:用两个指针,一个指向数组首元素(left),一个指向数组尾元素(right),交换两个指针指向的元素,然后left++、right--,直到left=right停止。

代码实现:

c

#includestdio.h

voidreverse_arr(int*arr,intlen){

if(arr==NULL||len=1){//边界判断,避免空指针和长度异常

return;

}

int*lef

文档评论(0)

1亿VIP精品文档

相关文档