共用体
构造数据类型,也叫联合体
用途:使几个不同类型的变量共占一段内存(相互覆盖)
结构体是一种构造数据类型
用途:把不同类型的数据组合成一个整体-------自定义数据类型
---------------------------------------------------------------
结构体变量所占内存长度是各成员占的内存长度的总和。
共同体变量所占内存长度是各最长的成员占的内存长度。
共同体每次只能存放哪个的一种!!
共同体变量中起作用的成员是尊后一次存放的成员,
在存入新的成员后原有的成员失去了作用!
---------------------------------------------------------------
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
的值就变得无用了。