C语言面试必问的经典问题(纯”gan“货)

C语言面试必问的经典问题

1.预处理

1. 预编译,编译过程最先做的工作是啥?何时需要预编译 ?指令有什么

答:预编译就是预处理,就是把一些文本的替换工作工作
预编译指令:#include、#ifdef 、#ifndef、#else 、#endif

编译#字开头的指令,如
拷贝#include包含的头文件代码,#define宏定义的替换,条件编译ifndef
答:
①总是经常使用但是不经常改动的大型代码。
②程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项,将所有包含文件预编译为一个 “预编译头”。

2.用一个宏来表示一年中有多少秒?

#define SEONDS_PER_YEAR(60*60*24*365)UL

3. c语言中 # 与 ##的区别以及作用

答:
# :把宏参数变成一个字符串;
## :把两个宏参数连接到一起(只能两个)
例:

#define hehe(x,y)  x##y
int main()
{
   

  char string[]="hello world!";

  printf("%s\n",hehe(str,ing)); 
 
 
   system("pause");
   return 0;
}

3. 写一个宏函数表示返回两个参数的最小值?

取两个数的最大值,用一个宏来表示,取两个数或者交换两个数的值,用一个宏来表示等这样的一些类问题

#define MIN(a,b) ((a)<(b) ? (a):(b))

4. 写一个宏求数组元素个数?

#define EKENEBTS(A) (sizeof(A)) / (sizeof(A[0]))

5.如何避免头文件被重复包含?

答:解决方法:
应用#ifndef #define #endif

2. 关键字

1.static关键字的作用?

分三种情况:

  1. static修饰的是一个全局的一个变量,它的作用域在我们整个.c文件里,并不属于我们整个工程。
  2. static修饰函数体内部,作用域也在函数体内部,它与局部变量的区别是,它的内存地址在全局区,局部变量的内存在栈区,而且它生命周期会变长,随着整个程序完事后才会消失。
  3. static修饰函数,作用域在我们整个.c文件里,并不属于我们整个工程。

答:static最主要功能是隐藏,其次因为static变量存放在静态存储区,具备持久性和默认值为0

①隐藏作用,可以在不同的文件中定义同名变量和同名函数。
②对于变量来说,保持变量持久,静态数据区的变量会在程序刚刚运行时就完成初始化,也是唯一一次初始化;储存在静态数据区,静态存储区只有两种变量(全局变量和static静态变量)。
③默认初始化为0x00,和全局变量一样的属性,减少程序员的工作量。

2.const关键字的作用

答:

①对变量加以限定不能被修改,常量必须在定义的时候同时被初始化。
②const和指针一起使用,

const int *p1;
int const *p2;
int *const p3;

在三种情况中,第三种指针是只读的,p3本身的值不能被修改;
第一二种情况,指针所指向的数据是只读的,p1,p2的值可以修改,但指向的数据不能被修改。
③const和函数形参一起使用
使用const单独定义变量可以用#define命令替换,const通常放在函数形参中。
如果形参是一个指针,为了防止在函数内部修改指针指向的数据就可以用const来限制。

3.volatile关键字的作用?

答:我们可以实时获取它这个变量的最新值

volatile它就是一个“易变”的一个变量,我们每次获取它值的时候,都是从它内存里去读取。

更深层次含义: 用volatile这样来告诉编译器,叫它不要对我这个变量做过分优化,也就是告诉它我这个变量用在哪,就实打实的访问它的内存,而不是访问这个变量所构建的一个寄存器

我们用这样的变量时候呢,它可能同时被好几个中断或者好几个线程同时调用,我们用volatile这样的变量可以保证获取这个变量值的实时性

4.extern关键字的作用?

答:
①函数内的局部变量,函数外定义的变量为全局变量,为静态存储方式,生存周期为整个程序,有效范围为定义变量的位置开始到本源文件结束。
如果在定义前想要引用该全局变量,则应该加上 extern作为 “外部变量声明”。

多个源文件的工程想要引用一个源文件的外部变量也只许引用变量的文件中加入extern关键字加以声明,但是可以在引用的模块内修改其变量的值,慎用。

②extern “C”: C++代码调用C语言代码。在C++的头文件中使用。

5.sizeof关键字的作用?

答:sizeof 在 编译阶段处理,作用为取得一个对象(数据类型或数据对象)的长度(即占用内存的大小,以1字节为单位)。

①指针可以看做变量的一种,32位操作系统sizeof 指针都为4,例子:

 int  *p; 
sizeof(p) =4;
sizeof(<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值