union联合体
先看定义方法,他和结构体的定义是相同的
union dt{
int a;
char b;
double c;
}data;
在看看他有什么特性
printf("%d\n", sizeof(data));
printf("%d\n", sizeof(data.b));
printf("%d\n", sizeof(data.a));
printf("%p\n",&data.a);
printf("%p\n",&data.b);
printf("%p\n",&data);
输出结果如下:
8
1
4
0xbfc26200
0xbfc26200
0xbfc26200
可以看出
1、union中可以定义多个成员,union的大小由最大的成员(double)的大小决定。
2、union成员共享同一块大小的内存(地址都相同),一次只能使用其中的一个成员。
data.a=1;
if(data.b==1){
printf("小端模式\n");
}
输出结果为:小端模式(稍后解释)
可以看出
3。对某一个成员赋值,会覆盖其他成员的值
在看一段代码
data.a=259;
char *p=(char *)&data;
int i;
for(i=0;i<sizeof(data.c);i++){
printf("%p ", p);
printf("%08u \n", *(p++));
}
printf("\n");
输出结果:
0xbfc26200 00000003 (00000011)
0xbfc26201 00000001 (00000001)
0xbfc26202 00000000
0xbfc26203 00000000
0xbfc26204 00000000
0xbfc26205 00000000
0xbfc26206 00000000
0xbfc26207 00000000
从这段代码中可以理解大小端的差异
259用二进制满16位表示为: 00000001 00000011
00000001是他的高位存在于高地址
00000011是他的低位存在于低地址(小端模式)
而大端模式是相反的。
明白了这些,也要知道使用union的情况:
1.要使用几个变量,但其中只有一个变量在任意给定的时刻有有效值
2.程序要处理许多不同类型数据,但是一次只能处理一种,要处理的类型在执行期间确定
3.要在不同的时间访问相同的数据,但在不同的情况下该数据的类型是不同的
第一次写博客,贴代码贴的不好,还有哪里有问题的地方,请提出一起讨论。