厦门建设网站企业,唐山如何做百度的网站,免费网站qq抓取,厦门seo外包服务目录
联合体
联合体的定义
联合体的长度
如果来判断设备的字节序#xff1f;
如何把大端数据转换成小端数据#xff1f;
枚举
枚举的定义 上一篇复习了结构体#xff0c;这一节复习联合体和枚举。 说明#xff1a;我们学过单片机的一般都是有C语言基础的了#xff…目录
联合体
联合体的定义
联合体的长度
如果来判断设备的字节序
如何把大端数据转换成小端数据
枚举
枚举的定义 上一篇复习了结构体这一节复习联合体和枚举。 说明我们学过单片机的一般都是有C语言基础的了网上关于C语言的资料有很多大家如果对C语言不熟悉的话可以先去详细学一下再以这篇博文作为复习资料学习。 这篇博文的目的是复习C语言我们会陆续以30多个编程题作为复习要点这30多个编程题基本涵盖了C语言所有的内容了只要你掌握了这30多个编程题那么你的C语言基本就没什么问题了。 注意由于本专栏是嵌入式全栈开发专栏为了我们能熟悉以后实际工作中的开发环境我们写C语言全部在Linux中的vim编辑器中写这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令以达到对口训练的目的
vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了如果不了解可以先去看看。 我们正式开始 联合体 为什么要学习联合体
结构体有个缺点就是比较占内存因为我们每次使用结构体时要给里面的每个成员都开辟空间但是有时候我们只需要用到里面的某个成员而不是全部我们只想为我们使用到的成员申请空间但是其他成员又不能直接删掉因为我们有时候还会使用到其他成员所以怎么办呢这个时候联合体就派上了用场。 联合体又叫共用体。是一种特殊的数据类型允许在相同的内存位置存储不同的数据类型。联合体可以带有多个成员但是任何时候只能有一个成员带有值。联合体提供了一种使用相同的内存位置的有效方式。 联合体的定义
定义联合体需要用到union关键字。union 语句定义了一个新的数据类型带有多个成员。
union 语句的格式如下 union 共用体名
{ 成员表列
}; 联合体的长度
例如
union test
{ int a; int b; char c;
};
它的总长度是4 联合体的特点
联合体的所有成员共享同一块内存空间联合体大小只为最长成员分配空间 如果我们给a初始化为100test.a100;
由于内存是同一个空间我们访问a即是访问b因此当我们打印b的时候结果也是100如果访问char c情况就有可能不一样因为我们不知道c是在4个字节的哪一端取决于电脑的字节序。 笔试的时候经常用联合体来判断设备的字节序。这个我们在复习一维数组的时候就已经提到过了 小端字节序低字节存放在低地址高字节存放在高地址。
大端字节序高字节存放在低地址低字节存放在高地址。
注意数组无疑是数组元素的地址是从低地址到高地址比如a[0]存放在低地址a[4]存放在高地址。 如果来判断设备的字节序 示例
假设联合体
union test
{ char ch[2]; short val;
}; 我们让val0x0102;这个是16进制里面有两个字节分别为0000 0001高字节和0000 0010低字节我们由于ch和val共享一个空间那么我们只要判断0000 0001是放在了ch[0]低地址还是放在了ch[1]高地址就能知道设备是小端字节序还是大端字节序了。 参考代码
#include stdio.hunion test
{char ch[2];//两个字节short val;//short是两个字节
};int main()
{//定义联合体变量union test t;t.val0x0102;if(t.ch[0]1t.ch[1]2){printf(big\n);}else if(t.ch[0]2t.ch[1]1){printf(small\n);}return 0;
}
运行结果 该设备为小端字节序一般来说电脑或者我们使用的开发板一般都是小端字节序。 如何把大端数据转换成小端数据
我们只需要将高字节和低字节调换位置即可
示例
假设int num1; 0000 0000 0000 0000 0000 0000 0000 0001这个1属于低字节现在要求将它挪到高字节。
提示将低字节取出来通过位移运算移动到高字节。
参考代码
#include stdio.hint main()
{int num1;printf(%d\n, ((num 0x000000ff)24)|(num 0x0000ff008)|(num 0x00ff00008)|(num 0xff00000016));return 0;}
运行结果 用计算器计算的结果也是16777216 枚举 枚举的关键字enum 枚举和宏定义有点类似。但是有些情况宏定义显得有点繁琐比如给每个星期的英文缩写重新定义一个数字 那么我们需要写
#define MON 1
#define TUE 2
#define WED 3
......
一个星期7天那我们重复宏定义7次这样就显得有点繁琐了因此我们需要用到枚举。 枚举的定义
enum weekday //这个weekday在这里可以不用也写
{ sunmontuewedthufrisat
}; 虽然枚举中我们并没有给sunmontuewedthufrisat定义0,1,2,3....但是编译器会默认sun是0mon是1tue是2....这样就可以申请繁琐的定义操作。 当然如果你不想要枚举默认那么你也可以自己指定比如
enum
{ sunmon11tuewedthufrisat
};
当我们这样讲mon定义成11时那么后面的tue也就跟着变成12了依次递增。 以上就是这篇内容如想了解更多欢迎订阅本专栏
如有问题可评论区或者私信留言如果想要进交流群请私信