What
所有成员共用一块内存空间。这块内存空间按照长度最大的成员来分配。
为什么按照最大的成员分配呢?
因为这样,这块内存就可以存储共同体不同数据类型的成员。
Why
How
通过union
关键字定义一个共用体
union Data
{
char c;
int i;
short m;
};
union Data data;
printf("%d\n", sizeof(data));//按照长度最大的成员来分配内存
data.i = 123456;//内存中存储的就是123456对应的二进制 因为是int类型,所以占用4个字节来存储
printf("%c\n %d\n %hd\n", data.c, data.i, data.m);//此时内存空间存储的就是123456对应的二进制数,根据数据类型的大小来提取内存中对应的字节进行输出
data.c = 's'; //数据是从地位到高位存储的,字符数据类型占用一个字节,所以就赋值到低位的第一个字节,也就是修改了低位第一个字节的数据
printf("%c\n %d\n %hd\n", data.c, data.i, data.m); //此时这块内存空间低位第一个字节存储的就是s字符的二进制,根据数据类型的大小来提取内存中对应的字节进行输出
getchar();
定义共用体的三种方式
注意
因为是共用一块内存空间,所以修改其中一个成员,都会影响其他成员的值。比如给int类型的成员赋值了以后,占用4个字节,然后再给字符类型赋值,就会修改第一个字节的值,此时再输出int类型的值 就不再是原本的值了,因为低位第一个字节被修改了。