嵌入式岗位面试八股文(篇一 关键字)

embedded/2025/1/12 16:16:50/

C%9A%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%B7%A5%E7%A8%8B%E5%B8%88%E6%88%90%E9%95%BF%E6%97%A5%E8%AE%B0">wx:嵌入式工程师成长日记

https://mp.weixin.qq.com/s/Mk8sodtNrodjD0Jjfo4Txw?token=1728731884&lang=zh_CN

 

1.continue

作用:跳过本次循环体中余下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为仅结束本次循环。(注意:continue语句并没有使整个循环终止)

只能用在循环语句

2.volatile

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

例:

Volatile int a=20,b,c;b=a;C=a;

代码执行流程如下:

B=a;先从a的内存中取值存放到寄存器,再把寄存器的值给存到b的内存

C=a;把寄存器的值给存到b的内存

可以看出编译器对c=a这步进行优化,不再执行从a的内存中取值,而是直接从寄存器中取值,如果这段时间内a的发生变化,那么c就不能得到最新的值,这个时候就需要使用volatile告诉编译器,不要对变量a优化,每次都是从内存中取a的值

常见场景:

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

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

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

4)外部任务会修改变量

3.Struct

CC++中的区别:

1.c语言中结构体是不允许有函数,在c++中可以

2.C语言结构体是不可以继承,c++可以继承

3.C语言中结构体的使用必须要用别名或者使用struct,不能直接使用例如:

Struct  student	{		int age;		int num;		int sex;Typedef struct student student;//必须得别名才可以使用或者struct student student;

4.在c中不可以初始化数据成员,c++可以初始化

4.classstruct的区别?

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

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

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

5.union

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

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

为了提高内存访问的效率,编译器会对结构体进行对齐对齐的方式按照成员的类型和顺序来进行

内存对齐和补齐:

32位下是4字节对齐,64位下是8字节对齐

图片

图片

计算的时候需要考虑字节对齐问题:

1.所占空间必须是成员变量中字节最大的整数倍

2.每个变量类型的偏移量必须是该变量类型的整数倍

3.对于联合体,由于所有变量都是共用一块内存,还需注意数组占用最大内存

例如:

Typedef union {double I;int k[5];char c;} DATE;

在联合体中成员变量最大为double8个字节,所以最终大小必须是8的整数倍;又因为联合体是共占内存空间,即int*5=20字节,所以最终为24个字节

6.enum

里面的变量会自加

图片

7.#definetypedef的区别

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

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

#define myptr int* p	myptr a,b;//a是int * a,    b是 int b	typedef  int*  myptr;	myptr a,b;//a是int * a,    b是 int* b

8.const

1.定义变量,表示该变量是个常量,不允许修改

例如:const int a=100;

错误:a=200;

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.const修饰函数在c++的类中是不能Virtua虚函数

6.const n = 3;

假设 const n = 3;

Int num[n] ={1,2,3}

问是否正确?

错误:在c语言中n并不是真正意义上的常量,它还是变量,对于数组来说必须要开辟一个准确的数组大小,C++中是可以编译过去。

    int n = 3;

    int num[n] = {1,2,3};//这样也是错误的,数组必须是确定的

注意:如果数组不初始化是没有报错的

int n = 3;

   int num[n];

在写代码的时候如果想要定义个常量最好是使用#define 而不要使用const

9.const 修饰的变量存放位置

对于const修饰的局部变量:存放在栈中,代码结束就会释放,在C语言中可以通过指针修改里面的值

对于const修饰的全局变量(已初始化的)存放在只读数据段,不可以通过指针修改里面的值,未出示化的存放在.bss

9.extern

1.声明外部变量:(保存在数据段)

如果想要定义一个变量被其他文件使用,即定义一个全局变量,这个变量不能定义在头文件里面,然后在需要调用该变量的.c文件里面extern声明该变量是不可以的,编译器会报错:multiple define 多个定义,

正确做法如下:

main.c文件里面定义变量int globe为全局变量,

fun.c文件里面extern int goble;即可 

该作用主要是告诉编译器我在其他文件定义了变量a,并且分配了空间,不再为该变量申请空间

2.Extern C

该做用是实现在c++中调用c语言代码,告诉编译器这部分代码要是有C编译

10.register

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

11.static

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

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

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

 

 wx:嵌入式工程师成长日记

https://mp.weixin.qq.com/s/Mk8sodtNrodjD0Jjfo4Txw?token=1728731884&lang=zh_CN


http://www.ppmy.cn/embedded/152872.html

相关文章

sql各种查询班级表和成绩表总结

目录 新建表的数据 查询每个班级成绩总和并排序 如果只想看有成绩的班级,使用INNER JOIN 如果要添加排名 如果要显示具体的排名(不跳号) RANK() vs DENSE_RANK() 添加及格率统计 统计各分数段人数 新建表的数据 班级表和成绩表 CRE…

CSS——32.字体风格

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>字体风格设置</title></head><body><!--字体风格&#xff1a;设置文字为倾斜效果--><!--font-style: 样式取值;--><!--样式取值:-->&l…

Unity中 Xlua使用整理(一)

1.安装: 从GitHub上下载Xlua源码 Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc. (github.com) 下载Xlua压缩包&#xff0c;并解压将Aseet文件夹中的Xlua和Plugins文件夹复制到Unit…

在 Ubuntu 下通过 Docker 部署 Misskey 服务器

引言 Docker&#xff0c;这个现代化的容器化平台&#xff0c;像是一把钥匙&#xff0c;打开了高效开发的门。它允许我们将应用及其所有依赖打包到一个轻量的容器中&#xff0c;确保在任何环境下都能顺利运行。Misskey 是一个强大且灵活的社交网络平台&#xff0c;允许用户创建…

力扣--83.删除排序链表中的重复元素

题目 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 代码 /** Definition for singly-linked list.public class ListNode { int val;ListNode next;ListNode() {}ListNode(int val) { this.val …

红帽认证 VS 华为HCIP哪个有用?

如果你是一名IT人&#xff0c;特别是网络工程师或者运维人&#xff0c;估计都知道“RHCE”和“HCIP”这两个认证吧&#xff01; 那么问题来了&#xff0c;这俩认证到底哪个更有用&#xff1f; 别急&#xff0c;今天就带大家了解了解&#xff01; 随着信息技术的迅速发展&…

使用java springboot 使用 Redis 作为限流工具

使用 Redis 作为限流工具 Redis 还可以用于实现限流功能&#xff0c;例如限制每个 IP 地址的访问次数。你可以使用 Redis 的计数器功能来实现这一点。 实现限流逻辑 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis…

Nginx:HTTP 方法控制

什么是 HTTP 方法控制? HTTP 方法控制 是指在 Nginx 中配置规则,以限制哪些 HTTP 请求方法被允许访问特定资源。HTTP 定义了多种请求方法,每种方法都有其特定用途: GET:用于请求获取指定资源。POST:用于向指定资源提交数据,通常用于提交表单或上传文件。PUT:用于更新指…