面试题汇总
一 . C基础
-
gcc编译器编译的完整流程,分别有什么作用?
答:预处理、编译、汇编、链接。预处理:头文件的展开/宏的替换/去掉注释/条件编译。编译:检查语法,生成汇编。汇编:汇编代码转换成机器码。链接:链接到一起生成可执行文件。
-
什么是回调函数?
答: 回调函数是一段可执行的代码段,它作为一个参数传递给其他的代码,其作用是在需要的时候方便调用这段(回调函数)代码。
-
地址能否使用printf函数中的 %u形式打印?
答:不能。
无论是不是unsigned,内存中存储的char类型的值都是一样的,都是0xFF。
printf("%u") 输出时,对char类型的变量会类型提升为int型。
因为 char 是带符号数字类型,所以会进行符号拓展。a 从 0xFF 拓展为 0xFFFFFFFF (4294967295)。
unsigned char 则会进行零拓展,b 从 0xFF 拓展为 0x000000FF (255)。 -
结构体与共用体的区别
答:结构体 联合体,又称共用体。编程的时候需要使几种不同类型的变量存放到同一段内存单元中,而衍生出来的一种类型。也就是说,联合体中每次只能存其中的一个变量,这个变量在联合体变量中存入新的成员就失效了!!!用法与结构体一致,但是多用于结构体内部。
注意:
(1)在struct中,各成员都占有自己的内存空间,它们是同时存在的。一个struct变量的总长度等于所有成员长度之和。在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在。Union变量的长度等于最长的成员的长度。
(2)对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于struct的不同成员赋值是互不影响的
-
static、const、volatile关键字有什么作用?
答:static:限定作用,延长生命周期。const:防止变量被修改。volatile:防止编译器过度优化,告诉编译器,每次取值都去内存中取。volatile主要用于中断函数子程序访问的非自动变量、多线程共享的全局变量、并行设备的寄存器。
-
声明变量和定义变量的区别
答:
-
赋值与赋初值有什么不同?
-
局部变量和全局变量能否重命名
-
如何引用一个已经定义过的外部变量
-
全局变量和局部变量的存储方式有什么区别?
-
const 与 # define 相比有何优点?
-
数组与指针的区别是什么?
-
为什么作为函数形参的数组和指针可以互换?
-
形参和实参有什么区别?
-
指针、数组和地址之间的关系是的什么?
-
void指针就是空指针吗?他有什么作用?
-
与内存息息相关的重要概念有哪些?(野指针、栈(stack)、堆(heap)、静态区)
-
#include<> 和 #include”” 有什么区别?
-
x=x+1 , x+=1 , x++ 哪个效率高?
-
为无符号类型变量赋值时,数据类型应怎样转换?
-
cpu执行程序的流程?
答:开辟一段0-4g的内存空间,开辟一个进程,把代码加载到寄存器中…