结构体 + 联合体 + 位域 使用

本文详细介绍了C语言中的结构体、位域和联合体的概念及使用方法。结构体用于组织相关数据,位域用于节省内存和方便计算,联合体则让成员共享同一块内存。通过实例展示了如何定义和操作这些数据类型,并在实际应用中,如电机电气特性和系统报警标志中如何使用它们。此外,还提到了联合体与结构体、位域结合使用的情况,以存储16位数据和报警标志为例进行了说明。
摘要由CSDN通过智能技术生成

  1. 简单介绍结构体

定义结构体,一般是对有相同属性的元素或成员的归纳,比如电机的电气特性:驱动电压、驱动电流、运行速度;还有比如系统报警类:过压报警、过流报警、欠压报警

本人常用格式

typedef  struct

{

u8 Volt;//成员变量

u8 Curr;

u16 Speed;

}Motor_InitTypeDef;

当然,还有其它的格式,可以自行查找

使用方法:

Motor_InitTypeDef Motor_InitStre;//定义结构体变量

Motor_InitStre. Volt=23;//引用成员变量

2.位域

定义位域,本人理解是,一方面是为了节省内存空间,另一方面为了计算快速、方便

示例:

u8 a:1;//a占字节的bit0

u8 b:2; //b占字节的bit2- bit1

u8 c:5; //c占字节的bit7- bit3

注意:

  (1)位域不能跨字节,如u8 a:9;这是错误的

(2)如果一个字节的剩余位小于下一个要定义的位长度,那么下一个位域将从新的字节开始

如u8 a:4;

u8 b:5

5+4>8,则b从新的字节开始

位域一般使用在结构体中,如下:

typedef  struct

{

u8 a:1;//成员变量

u8 b:1;

u8 c:1;

}Alarm_InitTypeDef;

使用方法如下:

Alarm_InitTypeDef  Alarm_InitStre; //定义结构体变量

Alarm_InitStre.a=1;//赋值1或0

3.联合体

联合体成员共用一段内存,一般联合体成员的数据类型是相同的,但也有不同的,这个就要根据实际内存存放格式决定了(大小端模式),这里不再介绍

本人常用格式

typedef union

{

u8 a;//

u8 b;

u8 c;

}Data_InitTypeDef;

使用方法如下:

Data_InitTypeDef Data_InitStre;

Data_InitStre.a=15;

4.联合体与结构体、位域一起使用

这里直接先举例说明,本人常用2种情况

  1. 是存储u16位数据(32位数据类似)

typedef  struct

{

u8 data_low;//低8位数据

u8 data_high;//高8位数据

}Data_InitTypeDef;

typedef union

{

  u16 data_all;//16位数据

Data_InitTypeDef Data_InitStre;//定义结构体变量

}Un_Data_ InitTypeDef;

Un_Data_ InitTypeDef  Un_Data_ InitStre;//定义联合体变量

Data_InitStre. data_low=0x02;

Data_InitStre. data_high=0x02;

Data=Un_Data_ InitStre. data_all;//这里就等于结构体成员高低字节相加

//那么Data=0x0202

2.报警标志

有的产品中有很多报警标志,如果每个报警都占用一个字节会占用很多内存,而且不方便计算,故而使用结构体+位域+联合体

示例代码如下:

typedef  struct

{

u8 a:1;

u8 b:1;

u8 c:1;

u8 d:1;

}Alram_InitTypeDef;

typedef union

{

  U8 Alarm _all;

Alram_InitTypeDef  Alarm_InitStre;//定义结构体变量

}Un_Alarm_ InitTypeDef;

Un_Alarm_ InitTypeDef  Un_Alarm_ InitStre;

Alarm_InitStre.a=1;

Alarm_InitStre.b=0;

Alarm_InitStre.c=1;

Alarm_InitStre.d=0;

Alarm=Un_Alarm_ InitStre. Alarm _all;// Alarm=0x05即=0101,是abcd的位组合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值