文章目录
一、前言
昨天被一家企业邀请了视频笔试,第一次经历视频笔试,这里总结一下体验和题目,防止后续有类似情况,一时间不知道从哪个地方开始准备。
春招目前应该也在进行了,这里也算是跟大家一起分享一下嵌入式软件开发岗的一些面试题目。
二、笔试题目
1、C语言中的三种循环以及区别
- for循环
- while循环
- do…while循环
区别:for循环和while循环是先判断条件是否成立,然后执行语句,而do…while循环
是先执行语句,然后再判断条件。
当然如果再细分的话还有下面两条。
1)while和do…while需要在循环开始前给循环变量赋初始值,for循环在表达式1中进行初始化。
2)for循环更加方便能够精确控制循环次数。
2、以下代码循环几次?
int k = 0;
while (k = 1)
{
k++;
}
怀疑题目写错了,当时答的时候直接指出while括号中的语句应该是条件判断语句,而不是赋值语句,当时也是直接写明了。
如果将while括号中的语句换成k == 1;程序一次也不会执行循环语句,因为上来判断括号中的条件就是假。
3、形参与实参定义以及函数形参为指针和指针引用方式的区别。
-
形参:全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参对应,并且实参必须要有确定的值。
-
实参:全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,
在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
当函数的形参为指针时:形参只是获得了实参的地址值,当你改变形参的指向时,实参的指向并不改变。当函数的形参为指针引用时:形参不仅仅获得了实参的地址值,还和实参地址绑定,改变形参的指向就能改变实参的指向。
引用就类似于给实参取了一个别名,在改变时实参也会跟着改变。
引用是C++中的概念,本人不甚了解,这里只贴出搜到的其他大佬的解释
4、链表的概念,链表与数组的区别
个人不太了解,这里就不再详细写了,大家可以去看其他博主的文章。当时答的时候只写了数组赋值只能一个一个赋值,别的不知道,实属是菜鸟了。
5、3.5 + 1/2的结果
答案为3.5。其中1/2,因为1和2均为整形数,所以1/2结果为0。3.5为double变量,3.5+0=3.5。
6、以下程序运行结果是什么?
int i = 1;
prinf("%d,%d,%d",i,i++,i+++);
这个题目实际也存在问题,在C语言中没有i+++的操作。
这里改变一下题目,将打印语句改成
prinf("%d,%d,%d",i,i++,++i);
运行结果是3,2,3。
下面简单介绍一下计算过程。
1)首先介绍一下i++和++i的区别:
- a = i++的意思是,先把i的值赋给a,即a = i,再执行i = i + 1;
- a = ++i是先执行 i = i+1,再把i的值赋给a;
举个例子来说,如果一开始 i = 4。
那么执行a = i++ 这条语句之后,a = 4,i = 5;
那么执行a = ++i 这条语句之后,i = 5,a= 5;
总结一句,++i 是先加后用,i++是先用后加。
2)当碰到printf之后又会产生不一样的化学反应。
printf是从右往左计算,从左往右输出。就是说函数printf从右到左压栈,然后将先读取到的放到栈底,最后读取到的放到栈顶,输出时候从栈顶开始。
如此来看上面的计算过程,从右往左开始处理,先处理++i,++i是先计算后使用,也就是i先加1,变成2,但是暂时不使用。再往后处理i++,先使用,后计算。就是说先将i=2输出,然后再加1,此时i=3,这时计算完成,++i开始使用i的值,输出为3。最终i值为3,所以i的输出为3。printf输出的时候是从左往右,因此输出结果为3,2,3。
拓展一下,如果将print语句改成prinf(“%d,%d,%d”,i,++i,i++);结果是多少?
7、int(*s[10])(int)的含义
这里附上一个大佬的解读:
链接:https://www.nowcoder.com/questionTerminal/32372cbd0f22496481a91d9bfcdbc511
来源:牛客网
1、首先*s[10] 是一个指针数组,s 是一个含有10个指针的数组,故可以这样来看这条声明语句:假设 p 等价于 s[10],声明语句变为 int (*p)(int);
2、观察 int (*p)(int), 从名字开始,p前面有一个 * ,因此 p 是指针,右侧是形参列表,表示p指向的是函数,在观察左侧,函数返回的是 int;
3、则 int (*p)(int) 解读为:函数指针,指向一个 int func(int param) 的函数;
4、故 int (*s[10])(int) :解读为:函数指针数组,每个指针指向一个 int func(int param)的函数。
8、const char*,char const*,char* const的区别
搜了一些其他博主的文章,大家的理解似乎是相同的。
- const char*:定义一个指向字符常量的指针。
- char const*:与const char*相同。
- char* const:定义一个指向字符的指针常数,即const指针。
9、volatile的作用
遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用volatile,则编译器将对所声明的语句进行优化。
简洁的说就是:valatile告诉编译器该变量不需要进行编译优化。
10、以下代码是否存在错误
void swap(int *p1,int *p2)
{
int *p;
*p = *p1;
*p2 = *p;
}
这是一个较为简单的问题,在上面的函数中*p未进行初始化,正确代码应该为
void swap( int* p1,int* p2 )
{
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
}
三、总结
本人面试的岗位要求是熟练使用C语言等,但是实际笔试内容涉及到了C++的知识,其次个人发现笔试题目中有些错误,显得有些不专业。
本次笔试形式是HR直接视频通话,期间对方的摄像头会对准题目,共10道题目+一道英语翻译(实在没想到笔试还有英语翻译),时间总共30分钟。