嵌入式软件工程师面试题——2025校招社招通用(C/C++)(三十六)

发布时间:2024年01月24日

说明:

  • 面试群,群号: 228447240
  • 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
  • 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
  • 博主与大家一起学习,一起刷题,共同进步;
  • 写文不易,麻烦给个三连!!!

前面1-15已经是C/C++,但是由于前面写的比较混乱,把八股文和题目混在了一起,所以从这一篇开始重新整理重新写,前面1-15也就可以选看了,希望多多支持!

1.谈一谈Volatile关键字

答案:

作用:告诉编译器该变量是容易发生变化的,不能对该变量进行优化,每次取值都必须从内存中取值而不是直接去取之前在寄存器中的值。

常见场景:

1)多线程使用共享变量:因为多线程是多核操作,同时进行。

2)中断:中断程序会修改其他程序中使用的变量。

3)硬件寄存器:因为寄存器随时会被修改,好比AD转换的寄存器,随时会因为电压变化而修改。

4)外部任务会修改变量。

2.Struct(结构体) (C和C++区别,求结构体大小,使用的注意事项)

答案:

  1. 在c语言中结构体是不允许有函数,在c++中可以;
  2. C语言结构体是不可以继承,c++可以继承;
  3. C语言中结构体的使用必须要用别名或者使用struct,不能直接使用;
  4. 访问权限不同。在c中默认是共有,不可以修改权限,在c++中权限可以修改;
  5. 初始化。在c中不可以初始化数据成员,c++可以初始化;
  6. C++中空结构体大小为1,C为0。

3.class和struct的区别?

答案:

1)继承权限:class是默认private,struct是public;

2)访问权限:class作为对象的实现体,默认是私有访问,而struct是作为数据结构的实现体,是共有访问;

3) class可以用于定义模板,而struct不能。

4.联合体union和结构体struct的区别

答案:

?对于联合体所有的成员都共享一块内存,而结构体是所有变量内存的叠加,需要考虑字节对齐问题,对于联合体来说,只要你修改里面的成员的数据就会修改其他成员的数据,而结构体的成员数据是不影响的。

5.#define和typedef的区别

答案:

#define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。

typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。

6.关于const 你了解多少

答案:

(C中的变量:局部,函数形成,返回值,指针,typedef的区别,数组大小定义,case ??C++:常函数,常对象)

  1. 定义变量,表示该变量是个常量,不允许修改
  2. 修饰函数参数,表示函数体内不能修改该参数的值
  3. 修饰函数的返回值 const char getstr()
  4. const修饰的常见:
    const int a;int const a;是一样的都是修饰变量a为常量
    const * int a ; int const *a ; 修饰的是这个指针指向的内容不允许修改,这个指针的地址可以改变 常量指针
    int * const a; 修饰的指针,表示这个指针的地址不可以修改,地址的内容可以修改 指针常量
    const int * const a;表示指针的地址不可以修改,内容也不可以修改
  5. C++中的const修饰的成员函数可以是虚函数,但是无法通过const修饰符来实现函数的覆盖

  6. 在C++类中有常函数的概念。void fun() const { ?}??像这种就是常函数,这种函数只能读取类中数据,不能修改

  7. 常对象。常对象只能调用常函数

  8. const 修饰的变量存放位置。对于const修饰的局部变量:存放在栈中,代码结束就会释放,在C语言中可以通过指针修改里面的值。对于const修饰的全局变量(已初始化的)存放在只读数据段,不可以通过指针修改里面的值,未出示化的存放在.bss。

7.Extern关键字

答案:

  1. 声明外部变量:(保存在数据段)。
  2. 声明外部外部函数声明外部一样。
  3. Extern?“C”。实现在c++中调用c语言代码,告诉编译器这部分代码要是有C编译。

8.Register关键字

答案:

存在寄存器里面,即cpu,该值不能取地址操作,并且是整数,不能是浮点数。

9.Auto关键字

答案:

一般情况下我们没有特别说明的局部变量都是默认为auto类型,存储在栈中。

10.关键字static的作用是什么

答案:

1.定义变量

静态全局变量------>作用域只能作用于本文件,每次函数调用该变量都会被初始化。

静态局部变量----->生命周期不会随函数结束结束,直到程序结束,但是在函数外面不能使用该变量,只能在函数中使用,该变量是有记忆的,会记住上次的值,该变量只被初始化一次。

对于这两种变量来说,如果初始化的会在数据段内未初始化的在.bss段或者初始化为0,这两种变量都会在程序结束才会释放,只不过作用域不同,静态局部变量只限定于函数中,但是该函数结束,该变量并没有被干掉,静态全局变量限定于本文件中。

2.定义函数

在函数返回类型前加上static关键字,函数即被定义为静态函数。静态函数只能在本源文件中使用;也就是说在其他源文件中可以定义和自己名字一样的函数。

3.定义类中的静态成员变量(不能在类里面初始化,不占类内存空间,必须定义才能使用)

在类中的静态成员变量它即可以被当做全局变量那样存储,但又被隐藏与类中,类中的静态成员变量拥有一块独立的储存空间,不会占用类中的空间,所有的对象都共享该静态成员,也就是说,只要有对象改变了这个值,那么其他对象就会受影响,该数据可以使用this,也可以类中其他函数访问。

注意:静态数据成员不能在类中初始化在类中只是声明,而不是定义,静态数据必须要定义之后才能使用实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。

4.定义类中的静态成员函数(只能访问静态成员变量)

静态成员函数也是类的一部分,而不是对象的一部分。所有这些对象的静态数据成员都共享这一块静态存储空间。
注意:静态成员函数不属于任何一个对象,因此C++规定静态成员函数没有this指针(划重点,面试题常考)。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行访问,即不能在静态函数里面使用this指针。

11.Sizeof()和strlen()的区别

答案:

首先sizeof是关键字,strlen是函数,sizeof用来计算占用内存大小,strlen是用来计算字符串的长度。

特别是对于需不需要包含\0问题:

sizeof是需要给\0计算空间的,strlen是不需要;

sizeof是在编译的时候计算的,而strlen是在运行的时候计算;

sizeof计算的是数组的大小即数据类型*[];

strlen计算的是字符串长度;

12.new/malloc 与 delete/free(指明大小,返回值,初始化)

答案:

1.首先new/delete是运算符,而malloc和free是函数;

2.new先为对象申请内存空间,然后再调用构造函数进行初始化,同理delete可以调用析构函数释放内存,而 malloc只是申请内存空间并不能调用构造函数进行初始化,同理free也只是释放内存;

3.malloc的返回值需要强转为自己申请的内存指针,而new不需要;

4.malloc需要指定申请内存的内存大小,而new是动态申请。

文章来源:https://blog.csdn.net/weixin_45257157/article/details/135817765
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。