c++ 联合

来源:百度知道 编辑:UC知道 时间:2024/06/23 03:23:41
#include <iostream>
using namespace std;
union un
{
char c;
int i;
double d;
};
int main()
{
un u;
u.c='a';
cout<<u.c<<endl;
u.i=100;
cout<<u.i<<endl;
u.d=4.56;
cout<<u.i<<endl;
cout<<u.d<<endl;
return 0;
}
为什么int 输出的不是100呢?
而是-1546188227呢?

首先你要弄清联合union和结构体struct的区别。
如果你想得到你相要的结果,你把Union改为struct就行了。
下面说一下它们的区别:
1.union中所以的成员只分配一块内存,而内存的长度由联合体中所占空间最大的成员决定。在你的例子中应该由d来决定,我先给c赋值,那显然分配的内存用不完,你把c输出得到的是正确的值,因为他会根据赋的值自动的寻址。但这个时候你要包i或者d输出,得到的将是一个未知的值。
即使你之前给i赋过值,但后来你又给d赋值,这个操作或覆盖之前的i的值。
所以最后你输出的i是一个不确定的值。
2.结构体,是为每一个成员都分配了一块空间。因此他的总内存是所以成员的和。每个成员之间相当独立,设置成员,不会影响到其他成员的值。

因为联合体下的所有变量公用同一内存地址,所以他们实际存储的值只有一个,即最后赋值的那个,所以即想再输出以前的赋值是不可能的。

第一个int输出的是对的嘛,然后你都把这个变量赋成4.56了,当然不能再输出100