嵌入式软件—视频笔试记录

一、前言

昨天被一家企业邀请了视频笔试,第一次经历视频笔试,这里总结一下体验和题目,防止后续有类似情况,一时间不知道从哪个地方开始准备。

春招目前应该也在进行了,这里也算是跟大家一起分享一下嵌入式软件开发岗的一些面试题目。

二、笔试题目

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分钟。

猜你喜欢

转载自blog.csdn.net/qq_45217381/article/details/129060033