共用体(union):分配给公用体的存储区域大小至少要有存储其中最大一种数据所需的存储空间量。
定义:
union 共用体类型名
{
成员说明列表;
};
一下我通过一个例子说明共用体的地址共享:
#include <iostream>
using namespace std;
union data{
int i;
double j;
struct{
double jj;
int ii;
} b;
};
int _tmain(int argc, _TCHAR* argv[])
{
data b;
b.i = 1;
cout << b.i <<endl;
b.j = 2.2;
cout << b.i <<endl;
cout << b.j <<endl;
b.b.ii = 3;
b.b.jj = 4.4;
cout << b.i <<endl;
cout << b.j <<endl;
cout << b.b.ii << endl;
cout << b.b.jj << endl;
cout << &b.i <<endl;
cout << &b.j <<endl;
cout << &b.b.ii << endl;
cout << &b.b.jj << endl;
cout << sizeof(int) << endl;
cout << sizeof(float) << endl;
cout << sizeof(data) << endl;
cin >> b.i;
return 0;
}
运行输出的结果为:
1
1074580685
2.2
3
4.2039e-045
3
4.4
007CFA08
007CFA08
007CFA08
007CFA0B
4
4
8
结果分析:
第二行输出结果为1074580685表示2.2存在起始地址007CFA08,覆盖了原来地址空间上的值1,所以b.i时得到的不是1;
把结构体加入公用体中,由起始地址和输出的值,可以得出结构体的地址分配是基本数据类型所占空间的总和。变量存储也是按照结构体定义是变量声明的顺序分配空间。正因为如此才有b.i=b.b.ii和b.i与b.bb.ii的起始地址相同。
欢迎大家参与讨论,分析自己的结果!