一、共用体类型的定义、变量定义和使用
- 共用体union和结构体struct在类型定义、变量定义、使用方法上很相似。
- 共用体和结构体的不同:结构体中的成员彼此是独立存在的,分布在内存的不同单元内,他们只是被打包成了一个整体叫做结构体而已;公用体中的各个成员其实是一体的,彼此不独立,他们共同使用一个内存单元。可以理解为:同一个内存空间有不同的解释方式。
- 公用体就是对同一块内存二进制的不同理解方式。
- union的sizeof测到的大小实际是union中各个元素里面占内存最大的那个元素的大小。
- union不存在内存对齐的问题。所有元素都从同一个地址开始。
#include <stdio.h>
union myunion
{
int a;
char b; //a和b指向同一个内存,只是对这块内存空间有两种解析方式。
};
struct mystruct
{
int a;
char b;
};
int main(void)
{
union myunion u1;
u1.a=23;
printf("u1.b=%d.\n",u1.b); //23
printf("&u1.a=%d.\n",&u1.a);
printf("&u1.b=%d.\n",&u1.b);
printf("sizeof(union myunion)=%d.\n",sizeof(union myunion)); //4
//a和b指向同一块内存空间,只是对这块内存空间不同的解析规则
struct mystruct s1;
s1.a=23;
printf("s1.b=%d.\n",s1.b); //0
return 0;
}
二、共用体和结构体的相同和不同
- 相同点:操作语法几乎相同。
- 不同点:本质上不同,struct是多个独立元素打包在一起;union是一个元素不同的解析方式。
三、共用体的主要用途
- 用在对同一个内存单元进行多种不同规则解析的环境。
- c语言中可以没有共用体,用指针和强制类型转换可以替代共用体的方式。但是用共用体更简单更方便。
#include <stdio.h>
union test
{
int a;
float b;
};
int main(void)
{
union test t1;
t1.a=11233477881;
printf("t1.b=%f.\n",t1.b);
printf("指针方式:=%f.\n",*((float *)&a));
return 0;
}