共用體
構造數據類型,也叫聯合體
用途:使幾個不同類型的變量共占一段內存(相互覆蓋)
結構體是一種構造數據類型
用途:把不同類型的數據組合成一個整體-------自定義數據類型
---------------------------------------------------------------
結構體變量所占內存長度是各成員占的內存長度的總和。
共同體變量所占內存長度是各最長的成員占的內存長度。
共同體每次只能存放哪個的一種!!
共同體變量中起作用的成員是尊后一次存放的成員,
在存入新的成員后原有的成員失去了作用!
---------------------------------------------------------------
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
的值就變得無用了。
?