嵌入式 结构体(struct)、联合体(union)以及两者联合组成的位域之学习总结

一、结构体

 1.代码形式:

(1)直接写(但是每次声明都需在前面加一个struct)

struct ABC{
    char a;
    char b;  
};

int main(){
    struct ABC abc;
    char i = abc.a;
    struct ABC bcd;
    char j = abc.b;
}

 (2)加typedef

typedef struct{
    char a;
    char b;
}ABC;

int main(){
    ABC abc;
    char i = abc.a;
    ABC def;
    char j = def.b;
}

2.内存对齐方式:

取定义在结构体中最大字节类型所占字节数为对齐方式

//示例一
typedef struct{
    char  a;
    short b;
    char  c;
    char  d;
}ABC;
//变量所占空间 -代表一个字节 字母表示所占该变量所占的位置
//a  bb cd
//-- -- --
//a变量后面空了一个字节原因是b需要俩个字节 而本结构体对齐方式为俩字节
//所以会为b单独再开俩个字节,所以该结构体需要6个字节空间

//示例二
typedef struct{
    short a;
    char  b;
    short c;
    char  d;
}ABC;
//aa b  cc d 
//-- -- -- --
//和上面差不多自己理解一下就懂

//示例三
typedef struct{
    double a;
    short b;
    char c;
    short d;
}
//最大字节单位是8个字节
//aaaaaaaa bbcdd
//-------- --------
//用了16个字节

//示例四
typedef struct{
    short a;
    double b;
    char c;
    short d;
}
//最大字节单位是8个字节
//aa       bbbbbbbb cdd
//-------- -------- --------
//用了24个字节

 二、联合体

  1.代码形式:

(1)直接写(但是每次声明都需在前面加一个union)

union ABC{
    char a;
    char b;  
};

int main(){
    union ABC abc;
    char i = abc.a;
    union ABC bcd;
    char j = abc.b;
}

 (2)加typedef

typedef union{
    char a;
    char b;
}ABC;

int main(){
    ABC abc;
    char i = abc.a;
    ABC def;
    char j = def.b;
}

2.内存对齐方式:

//示例一
typedef union{
    char a;
    char b;
}ABC;
//联合体内定义的变量都将占用同一个单位
//a
//b
//-
//上面表示的是a和b共用同一个字节

//示例二
typedef union{
    short a;
    char b;
}ABC;
//联合体内定义的变量都将占用同一个单位
//aa
//b
//--

//示例三
typedef union{
    short a;
    char b;
    float c;
    char D[20];
}ABC;
//联合体内定义的变量都将占用同一个单位
//aa
//b
//cccc
//DDDDDDDDDDDDDDDDDDDD
//--------------------

//在上面的实例中,D 将占用 20 个字节的内存空间,因为在各个成员中,
//字符串所占用的空间是最大的。下面的实例将显示上面的共用体占用的总内存大小.

3.可用作浮点数数据收发解析

//串口的浮点数数据解析(二进制) 用字符串解析太拉了费时费力
typedef union{
    float val;
    char data[4];
}ABC;

int main(){
    //模拟发送端
    ABC send;
    send.val = 123.45678;
    //模拟接收端
    ABC recv;
    memcpy(recv.dat,semd.dat,sizeof(ABC));
    
    float a = recv.val;
    printf("a=%f",a);
}
//最后打印的结果为
//"a=123.456779"

三、位域(节省带宽、节省字节、高级协议数据解析)

//位域:按位来分配内存(一个字节8位)
//按最大数据类型字节数为单位 下面为一个字节
typedef struct{
    char c:5;        //小端模式 c放在最低位
    char b:2;
    char a:1;        //高位
}ABC;
//abbccccc(单位:位)
//--------

typedef union{
    char dat;
    ABC parser;
}Protocal;

int main(){
    Protocal abc;
    abc.parser.a = 1;
    abc.parser.b = 1;
    abc.parser.c = 7;
    int n =abc.dat;
    printf("n=%x",n);
}
//打印结果
//"n=0xA7"
//原因:
//abbccccc
//10100111=(0xA7)x

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值