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 0062FE9Creturn 0;
}
规则:
共用体成员共用同一段内存空间,所有成员的首地址都是一样的。
共用体空间所占内存大小:成员中占用空间最多的成员所占的字节数
对一个成员的写操作,会影响其他成员的数据。
例:
#include<stdio.h>
union data
{int a[5];char b;doube d;
};int main()
{printf("%d",sizeof(union data)); // 20return 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);
};