What

所有成员共用一块内存空间。这块内存空间按照长度最大的成员来分配。
为什么按照最大的成员分配呢?
因为这样,这块内存就可以存储共同体不同数据类型的成员。

Why

可以节约空间

How

通过union关键字定义一个共用体

  1. union Data
  2. {
  3. char c;
  4. int i;
  5. short m;
  6. };
  7. union Data data;
  8. printf("%d\n", sizeof(data));//按照长度最大的成员来分配内存
  9. data.i = 123456;//内存中存储的就是123456对应的二进制 因为是int类型,所以占用4个字节来存储
  10. printf("%c\n %d\n %hd\n", data.c, data.i, data.m);//此时内存空间存储的就是123456对应的二进制数,根据数据类型的大小来提取内存中对应的字节进行输出
  11. data.c = 's'; //数据是从地位到高位存储的,字符数据类型占用一个字节,所以就赋值到低位的第一个字节,也就是修改了低位第一个字节的数据
  12. printf("%c\n %d\n %hd\n", data.c, data.i, data.m); //此时这块内存空间低位第一个字节存储的就是s字符的二进制,根据数据类型的大小来提取内存中对应的字节进行输出
  13. getchar();

定义共用体的三种方式

和结构体的方式一样,只是关键字不同。

注意

因为是共用一块内存空间,所以修改其中一个成员,都会影响其他成员的值。比如给int类型的成员赋值了以后,占用4个字节,然后再给字符类型赋值,就会修改第一个字节的值,此时再输出int类型的值 就不再是原本的值了,因为低位第一个字节被修改了。共用体内存布局.png