1.C语言共用体的语法
union 共用体名{
数据类型 成员名;
数据类型 成员名;
...
}变量名;
2.共用体的特点
共用体(也称联合体)所有成员共享同一片存储区/内存。因此联合变量每个时刻里只能保存它的某一个成员的值。
3.共用体的详细规约
1)共用体是一种几个变量共用使用同一片内存空间的数据结构,在不同的时间保存不同的数据类型和不同长度的变量。
2)共用体中可以定义多个成员,所分配内存空间的大小是由成员所占内存空间的最大数据类型决定。
3)对某一共用体成员进行赋值,可能会覆盖其他成员的值;当成员所占字节数不同时,只会覆盖相应字节上的值。比如:char只占1个字节,而int占4个字节(windows操作系统),则char类型数据只会覆盖int类型数据的低地址1字节。
4)共同体union的存放顺序是所有成员都从低地址开始存放的。需要注意的是,这里所说的存放顺序从低地址开始存放指的是成员变量内存分布的存放顺序,与操作系统大端和小端无关,无论怎样,共同体成员都是从低地址开始存放的。举例如下:
union test
{
int a;
char b;
}coco;
上述共同体的内存布局应该是:
可以看到,int数据类型占4个字节,而char数据类型占1个字节,故结构体分配的内存空间一共是四个字节;union成员的存放顺序是从低地址开始存放的,故成员b只会共用低地址1个字节的内存空间。
4.C语言运用共用体典型示例
#include <stdio.h>
main()
{
union
{
char c;
int i;
float a;
}test;
test.i=0x1234;
test.c='A';
printf("%x\n",test.i);
}
程序在小端操作系统(一般计算机都是小端)运行结果:1241
解析:程序中先给i赋值,再给c赋值,因为i为int类型,而c为char类型,所以,当在给c赋值之后,会赋值原来已有的i的值,但又不足以完全覆盖,从而得到运行结果。
思考:如果是大端规则情况下,运行结果又是什么?