共用体
构造数据类型,也叫联合体
用途:使几个不同类型的变量共占一段内存(相互覆盖)

结构体是一种构造数据类型
用途:把不同类型的数据组合成一个整体-------自定义数据类型

---------------------------------------------------------------


结构体变量所占内存长度是各成员占的内存长度的总和。


共同体变量所占内存长度是各最长的成员占的内存长度。


共同体每次只能存放哪个的一种!!

共同体变量中起作用的成员是尊后一次存放的成员,
在存入新的成员后原有的成员失去了作用!

---------------------------------------------------------------


Structure 与 Union主要有以下区别:

    1. struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员, 而struct的所有成员都存在。在struct中,各成员都占有自己的内存空间,它们是同时存在的。一个struct变量的总长度等于所有成员长度之和。在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在。Union变量的长度等于最长的成员的长度。

    2. 对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于struct的不同成员赋值是互不影响的。


    
举一个例子:

例:

     #include <stdio.h>

     main()
     {
          union{                   /*定义一个联合*/
               int i;
               struct{             /*在联合中定义一个结构*/
                    char first;
                    char second;
               }half;
          }number;
          number.i=0x4241;         /*联合成员赋值*/
          printf("%c%c\n", number.half.first, number.half.second);
          number.half.first='a';   /*联合中结构成员赋值*/
          number.half.second='b';
          printf("%x\n", number.i);
          getch();
     }

    输出结果为:
     AB
     6261
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 1 #include  < iostream >
 2 using   namespace  std;
 3
 4 union U1 {
 5      char  c;
 6      int  i;
 7      double  d;
 8     }
;
 9 union U2 {
10      char  c;
11      // int i;
12      // double d;
13     }
;
14
15 union U3 {
16      char  c;
17      int  i;
18      // double d;
19     }
;
20
21 struct  S1 {
22      char  c;
23      int  i;
24      double  d;
25     }
;
26
27 struct  S2 {
28      char  c;
29      int  i;
30      // double d;
31     }
;
32
33 int  main() {
34     cout << " U1's size = " << sizeof (U1) << endl;
35     cout << " U2's size = " << sizeof (U2) << endl;
36     cout << " U3's size = " << sizeof (U3) << endl;
37     cout << endl;
38     cout << " -------------------------------- " << endl;
39     cout << " S1's size = " << sizeof (S1) << endl;
40     cout << " 其中 " << sizeof ( char ) << " + " << sizeof ( int ) << " + " << sizeof ( double ) << " = " << sizeof ( char ) + sizeof ( int ) + sizeof ( double ) << endl;
41     cout << " ---------- " << endl;
42     cout << " S2's size = " << sizeof (S2) << endl;
43     cout << " 其中 " << sizeof ( char ) << " + " << sizeof ( int ) << " = " << sizeof ( char ) + sizeof ( int ) << endl;
44     cout << " -------------------------------- " << endl;
45     S1 s;
46     s.c = ' A ' ;
47         cout << " 1 s.c =  " << s.c << endl;
48     s.d = 23.2132 ;
49         cout << " 1 s.d =  " << s.d << endl;
50
51         cout << " 2 s.c =  " << s.c << endl;
52         cout << " 2 s.d =  " << s.d << endl;
53         cout << " -----------------------  " << endl;
54     U1 u;
55         u.c = ' A ' ;
56         cout << " 1 u.c =  " << u.c << endl;
57     
58         u.i = 23322 ;
59         cout << " 1 u.i =  " << u.i << endl;
60
61         u.d = 23.2132 ;
62         cout << " 1 u.d =  " << u.d << endl;
63         cout << " 2 u.c =  " << u.c << endl;
64         cout << " 2 u.i =  " << u.i << endl;
65      return   0 ;
66 }

67


 

输出结果为:

U1's size =8

U2's size =1

U3's size =4

 

--------------------------------

S1's size =16

其中 1+4+8=13

----------

S2's size =8

其中 1+4=5

--------------------------------

1 s.c = A

1 s.d = 23.2132

2 s.c = A

2 s.d = 23.2132

-----------------------

1 u.c = A

1 u.i = 23322

1 u.d = 23.2132

2 u.c =

2 u.i = 1181975000

解释:

struct 类型的内存分配是结合内部的所有变量大小和相关的,但不是简单的相加,从上面的例子就可以看出来, struct 类型的分配的内存大小是应该内部最大数据类型的整数倍,不足一倍的部分会自动补全成一倍大小,应该是编译器为了数据整齐,处理速度会快些把。 union 类型的内存分配,只是和联合体内的最大的一个数据类型的大小相关,而且 union 内的所有数据都在一个单独的内存空间里面。这些就是上面程序出现这样的结果的原因。


   所以,
u.c 的值是 A ,当给联合体内的其他变量赋值之后, u.c 的值就是一个无用的信息。同样, u.i 的值最初是 23322 ,当给 u.d 赋值 23.2132 之后, u.i 的值就变得无用了。