共用體
構(gòu)造數(shù)據(jù)類型,也叫聯(lián)合體
用途:使幾個(gè)不同類型的變量共占一段內(nèi)存(相互覆蓋)
結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型
用途:把不同類型的數(shù)據(jù)組合成一個(gè)整體-------自定義數(shù)據(jù)類型
---------------------------------------------------------------
結(jié)構(gòu)體變量所占內(nèi)存長(zhǎng)度是各成員占的內(nèi)存長(zhǎng)度的總和。
共同體變量所占內(nèi)存長(zhǎng)度是各最長(zhǎng)的成員占的內(nèi)存長(zhǎng)度。
共同體每次只能存放哪個(gè)的一種!!
共同體變量中起作用的成員是尊后一次存放的成員,
在存入新的成員后原有的成員失去了作用!
---------------------------------------------------------------
Structure?與?Union主要有以下區(qū)別:
????1.?struct和union都是由多個(gè)不同的數(shù)據(jù)類型成員組成,?但在任何同一時(shí)刻,?union中只存放了一個(gè)被選中的成員,?而struct的所有成員都存在。在struct中,各成員都占有自己的內(nèi)存空間,它們是同時(shí)存在的。一個(gè)struct變量的總長(zhǎng)度等于所有成員長(zhǎng)度之和。在Union中,所有成員不能同時(shí)占用它的內(nèi)存空間,它們不能同時(shí)存在。Union變量的長(zhǎng)度等于最長(zhǎng)的成員的長(zhǎng)度。
????2.?對(duì)于union的不同成員賦值,?將會(huì)對(duì)其它成員重寫,?原來(lái)成員的值就不存在了,?而對(duì)于struct的不同成員賦值是互不影響的。
????
舉一個(gè)例子:
例:
?????#include?<stdio.h>
?????main()
?????{
??????????union{???????????????????/*定義一個(gè)聯(lián)合*/
???????????????int?i;
???????????????struct{?????????????/*在聯(lián)合中定義一個(gè)結(jié)構(gòu)*/
????????????????????char?first;
????????????????????char?second;
???????????????}half;
??????????}number;
??????????number.i=0x4241;?????????/*聯(lián)合成員賦值*/
??????????printf("%c%c\n",?number.half.first,?number.half.second);
??????????number.half.first='a';???/*聯(lián)合中結(jié)構(gòu)成員賦值*/
??????????number.half.second='b';
??????????printf("%x\n",?number.i);
??????????getch();
?????}
????輸出結(jié)果為:
?????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
?
輸出結(jié)果為:
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
類型的內(nèi)存分配是結(jié)合內(nèi)部的所有變量大小和相關(guān)的,但不是簡(jiǎn)單的相加,從上面的例子就可以看出來(lái),
struct
類型的分配的內(nèi)存大小是應(yīng)該內(nèi)部最大數(shù)據(jù)類型的整數(shù)倍,不足一倍的部分會(huì)自動(dòng)補(bǔ)全成一倍大小,應(yīng)該是編譯器為了數(shù)據(jù)整齊,處理速度會(huì)快些把。
union
類型的內(nèi)存分配,只是和聯(lián)合體內(nèi)的最大的一個(gè)數(shù)據(jù)類型的大小相關(guān),而且
union
內(nèi)的所有數(shù)據(jù)都在一個(gè)單獨(dú)的內(nèi)存空間里面。這些就是上面程序出現(xiàn)這樣的結(jié)果的原因。
???所以,
u.c
的值是
A
,當(dāng)給聯(lián)合體內(nèi)的其他變量賦值之后,
u.c
的值就是一個(gè)無(wú)用的信息。同樣,
u.i
的值最初是
23322
,當(dāng)給
u.d
賦值
23.2132
之后,
u.i
的值就變得無(wú)用了。
?