一、结构体
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