• 嵌入式交流群:705573984 资源分享群:708912078

关于C语言的一些面试题

嵌入式 admin 4年前 (2019-07-11) 1579次浏览 0个评论

1.static说明符的作用

由static修饰的变量,其存储类型为全局静态区,变量在程序的整个运行过程中不会被销毁,并且只会被初始化1次。

2.const限定符的作用,指针常量和常量指针的区别。

const限定符的作用就是把声明为const的数据(变量、指针、数组、结构等)保护起来,它们具有只读属性的,不能被改变。

3.define和const定义常量的区别

define是宏定义,程序在预处理阶段将用define定义的内容进行了替换

const定义的常量,在程序运行时在常量表中,系统为它分配内存。

define定义的常量,预处理时只是直接进行了替换。所以编译时不能进行数据类型检验。

const定义的常量,在编译时进行严格的类型检验,可以避免出错。

define定义表达式时要注意“边缘效应”

4.volatile修饰符的作用,在什么情况下使用

变量如果加了 volatile 修饰,则会从内存重新装载内容,而不是直接从寄存器拷贝内容。

5.restrict(限制,约束)修饰符有什么作用?

所有修改该指针所指向内存中内容的操作,都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改。

6.字节对齐

需要字节对齐的根本原因在于CPU访问数据的效率问题

7.可变参数函数处理

#include<stdarg.h>//包含stdarg.h头文件,处理可变参数函数

#include<stdio.h>

void print_ints(int args,…);//args后是可变参数

{

va_list ap;//va_list用来保存可变参数

va_start(ap,args);//说明可变参数从哪里开始

int i;

for (i = 0;i < args;i++)

printf(“ragument:%i\n”,va_arg(ap,int));//va_arg接受两个值,va_list和参数类型

va_end(ap);//用va_end告诉c做完了

}

void main()

{

print_ints(3,79,101,32);

}

8.枚举类型大小

枚举变量的取值为花括号内的任意一个值(有且只能有其中一个值),而这个值是int型的,在X86系统中,int型的数据占内存4个字节。所以sizeof(c) = 4,也就是枚举变量的值为4。

网址1:https://blog.csdn.net/lwj103862095/article/details/8607425

网址2:https://blog.csdn.net/bulebin/article/details/54388735

9.inline关键字有什么作用,什么情况下使用

在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。

inline的使用是有所限制的,inline只适合函数体内代码简单的函数使用,不能包含复杂的结构控制语句例如while、switch,并且不能内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数)。

下面我们来看一个例子:

#include <stdio.h>

//函数定义为inline即:内联函数

inline char* dbtest(int a) {

return (i % 2 > 0) ? “奇” : “偶”;

}

int main()

{

int i = 0;

for (i=1; i < 100; i++) {

printf(“i:%d    奇偶性:%s /n”, i, dbtest(i));

}

}

上面的例子就是标准的内联函数的用法,使用inline修饰带来的好处我们表面看不出来,其实,在内部的工作就是在每个for循环的内部任何调用dbtest(i)的地方都换成了(i%2>0)?”奇”:”偶”,这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。

10.switch表达式可以使用什么类型的变量

int , char

11.写个程序判断大小端

大端字节序存储:把一个数的低字节序的内容放在高地址处,相反,把高字节序的内容存放在低地址处,这种存储方式称为大端。

小端字节序存储:把一个数的低字节序的内容存放在低地址处,把高字节序的内容存放在高地址处,这种存储方式称为小端 。

网站:https://blog.csdn.net/qq_42270373/article/details/82432917

方法一:

方法二:

12.结构体位域

struct 位域结构名

{ 位域列表 };

其中位域列表的形式为: 类型说明符 位域名:位域长度

       位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。

13.结构体对齐

网站:https://blog.csdn.net/kuimzzs/article/details/81605160

14.短路求值

作为”&&”和”||”操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值(short-circuit evaluation)

如果expr1的值不是0,那么在下面的这个逻辑表达式的求值过程中:

expr1 || expr2

15.可以在头文件中定义全局变量吗?

注意头文件中不可以放变量的定义!!!一般情况下头文件中只放变量的声明,因为头文件要被其他文件包含(即#include),如果把定义放到头文件的话,就不能避免多次定义变量,C++不允许多次定义变量,一个程序中对指定变量的定义只有一次,声明可以无数次。

不过有三个例外,一下三中实体的定义也可放到头文件中。

1.值在编译时就已知的const 变量的定义可以放到头文件中

如:const int num(10);

2.类的定义可以放到头文件中

3.inline 函数

这三个实体可以定义在多个源文件中,只要在每个源文件中的定义相同。

16.全局变量不初始化的话,默认值是什么

数字都是0,bool类型也就是false,chat比较特殊是’\0’也就是字符结束的标记,然后string默认是空字符串也就是”或者NULL。指针类型除了char*默认是空字符串”或者NULL,其他就默认都是0。

17.memmove和memcpy的区别

当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。

注:部分答案来源于网络,仅供参考


转载请注明原文链接:关于C语言的一些面试题
喜欢 (1)

您必须 登录 才能发表评论!