union成员变量共享一段内存,同一时间只能储存其中一个成员变量的值
struct与union
1)联合默认访问权限也是公有的,并且,也具有成员函数(包括构造函数,析构函数)
2)共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放了一个被选中的成员, 而结构体的所有成员都存在。
3) 对于共用体的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的。
4)如果提供了初始值,则用来初始化第一个成员
union使用注意点:
union的成员不可以为静态、引用,如果是自定型态的话,该自订型态成员不可以有建构函式、解构函式或是复制指定运算子。
union内存空间大小问题:
1)一般为成员变量最大长度
2)最大变量长度的整数倍
1
2
3
4
5
6
7
8
9
10
11
|
union
foo
/*“共用”类型“FOO”*/
{
chars[10];
/*“字符”类型的数组“S”下面有“10”个元素*/
int
i;
/*“整数”类型i*/
};
|
匿名union
1)未命名uinion,在右花括号和分号之间没有任何声明,编译器自动创建一个未命名对象
2)在匿名union定义的作用域该union成员可以直接访问
3)不能包含受保护的成员或私有成员,也不能定义成员函数。
union{
char cval;
int ival;
double dval;
};
cval='c';
ival=42;
union使用:
1.请说出以下程序在intel x86环境下的执行结果。
#include<stdio.h> union { int x; char ch[2]; }a; int main() { a.ch[0] = 3; a.ch[1] = 6; printf("%d\n",a.x); return 0; }
首先了解主机字节序:
小端:按照从低地址到高地址的顺序存放数据的低位字节到高位字节
大端:按照从低地址到高地址的顺序存放数据的高位字节到低位字节
x = (0000 0110 0000 0011)= 1024 + 512 + 2 + 1 = 1539
2.(百度百科)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <stdio.h>
void
main()
{
union
number{
/*定义一个联合*/
int
i;
struct
{
/*在联合中定义一个结构*/
char
first;
char
second;
}half;
}num;
num.i=0x4241;
/*联合成员赋值*/
printf
(
"%c%c\n"
, num.half.first, num.half.second);
num.half.first=
'a'
;
/*联合中结构成员赋值*/
num.half.second=
'b'
;
printf
(
"%x\n"
, num.i);
getchar
();
}
|
AB
6261
从上例结果可以看出: 当给i赋值后, 其低八位0x41就是first的值,高八位0x42就是second的值; 当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高八位。