1、共用体
共用体 --- 用法和结构体类似
共用体:多个成员共用同一段内存空间。
1.1、共用体定义
union 共用体名
{
成员类型 成员名;
成员类型 成员名;
....
};
共用体的类型名:union 共用体名
例子:
定义一个共用体里面有两个成员,一个int类型,一个是char类型
union Test
{
int a;
char b;
};
// 共用体类型名:union Test
1.2、共用体变量
定义变量:
共用体类型 变量名;
union Test d;
变量访问成员: 点语法
#include<stdio.h>
union Test
{
int a;
char b;
};
// 共用体类型名:union Test
int main()
{
union Test d;
d.a = 0x12345678;
d.b = 0x11;
printf("%x %x\n",d.a,d.b); // 0x12345611 0x11
printf("%p %p\n",&d.a,&d.b); // 0062FE9C 0062FE9C
return 0;
}
规则:
共用体成员共用同一段内存空间,所有成员的首地址都是一样的。
共用体空间所占内存大小:成员中占用空间最多的成员所占的字节数
对一个成员的写操作,会影响其他成员的数据。
例:
#include<stdio.h>
union data
{
int a[5];
char b;
doube d;
};
int main()
{
printf("%d",sizeof(union data)); // 20
return 0;
}
2、共用体应用
2.1、共用体提取每个字节数据
#include<stdio.h>
union data
{
unsigned int a;
struct test
{
unsigned char a1;
unsigned char a2;
unsigned char a3;
unsigned char a4;
}d;
};
int main(void)
{
union data t;
t.a = 0x12345678;
printf("%x %x %x %x\n",t.d.a1,t.d.a2,t.d.a3,t.d.a4);
return 0;
}
2.2、共用体判断大小端
判断当前的机器是支持小端还是大端 --- 芯片的不同结构在处理数据存储方式不一样
大端:低地址存高字节数据,高地址存低字节数据
小端:低地址存低字节,高地址存高字节
实现思路:看低地址上存的低字节的数据还是高字节的数据
#include<stdio.h>
union test
{
int a;
unsigned char b;
}d;
int main (void)
{
d.a=0x12345678;
if(d.b == 0x78)
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
3、位域
C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。
例:
有1个字节,8位数据获取它的每一位
#include<stdio.h>
typedef union bit
{
unsigned char byte;
struct
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
}bits;
}bit_flag;
int main()
{
bit_flag a = 0xf8;
printf("%d %d %d %d %d %d %d %d\n",a.bits.bit0,a.bits.bit1,a.bits.bit2,a.bits.bit3,a.bits.bit4,a.bits.bit5,a.bits.bit6,a.bits.bit7);
};