共用體
構造數據類型,也叫聯合體
用途:使幾個不同類型的變量共占一段內存(相互覆蓋)

結構體是一種構造數據類型
用途:把不同類型的數據組合成一個整體-------自定義數據類型

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


結構體變量所占內存長度是各成員占的內存長度的總和。


共同體變量所占內存長度是各最長的成員占的內存長度。


共同體每次只能存放哪個的一種!!

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

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


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 的值就變得無用了。


?