在C++中,结构体和联合体操作很类似,那么,区别在哪里呢?首先看下面代码:
#include <iostream>
using namespace std;
struct more
{
int a;
char b[30];
short c;
}nn;
union less
{
char aa;
char bb[30];
char cc;
}mm;
void main()
{
nn.a=1;
strcpy(nn.b,"look");
nn.c=2;
cout<<sizeof(nn.a)<<endl;
cout<<sizeof(nn.b)<<endl;
cout<<sizeof(nn.c)<<endl;
cout<<sizeof(nn)<<endl;
cout<<nn.a<<endl;
cout<<nn.b<<endl;
cout<<nn.c<<endl;
cout<<endl;
mm.aa=1;
strcpy(mm.bb,"look");
mm.cc='2';
cout<<sizeof(mm.aa)<<endl;
cout<<sizeof(mm.bb)<<endl;
cout<<sizeof(mm.cc)<<endl;
cout<<sizeof(mm)<<endl;
cout<<mm.aa<<endl;
cout<<mm.bb<<endl;
cout<<mm.cc<<endl;
}
这些代码运行在vc++6.0中,可以直接复制过去实验,程序运行结果如下:
我们可以看到:
结构体nn可以正确存储数值和显示,而联合体mm却是存储了最后一次的赋值‘2’。可见,联合体中,能够访问的是最后一次被赋值的变量,因为联合体所有变量存储的首地址是相同的,最后一次赋值会把上一次的存储单元覆盖掉。
cout<<sizeof(nn.a)<<endl;
cout<<sizeof(nn.b)<<endl;
cout<<sizeof(nn.c)<<endl;
cout<<sizeof(nn)<<endl;
上面代码是读取结构图nn的长度,结果为4,30,2,36,可见,int a占四字节,char b[30]占30字节,short c占2个字节,整个结构体占4+30+2=36字节。
同理,再读取联合体mm的长度时:
cout<<sizeof(mm.aa)<<endl;
cout<<sizeof(mm.bb)<<endl;
cout<<sizeof(mm.cc)<<endl;
cout<<sizeof(mm)<<endl;
结果为1,30,1,30,可见,char aa占1字节,char bb[30]占30字节,
char cc占1字节,联合体的长度是按照最长的变量所占的字节算,所以为30
可见,结构体和联合体的核心区别就是在存储类型上,结构体是申请了所有变量的存储空间,联合体是申请了最大变量的存储空间。
但是,这里有个问题,关于字节对其的问题。
在32位系统中,char类型的对齐要求最小,只要1字节。
short的要2字节,int和float4字节,double最大需要8字节。
我们修改代码如下:
#include <iostream>
using namespace std;
struct more
{
int a;
char b[30];
double c;
}nn;
union less
{
int aa;
char bb[30];
short cc;
}mm;
void main()
{
nn.a=1;
strcpy(nn.b,"look");
nn.c=2;
cout<<sizeof(nn.a)<<endl;
cout<<sizeof(nn.b)<<endl;
cout<<sizeof(nn.c)<<endl;
cout<<sizeof(nn)<<endl;
cout<<nn.a<<endl;
cout<<nn.b<<endl;
cout<<nn.c<<endl;
cout<<endl;
mm.aa=1;
strcpy(mm.bb,"look");
mm.cc='2';
cout<<sizeof(mm.aa)<<endl;
cout<<sizeof(mm.bb)<<endl;
cout<<sizeof(mm.cc)<<endl;
cout<<sizeof(mm)<<endl;
cout<<mm.aa<<endl;
cout<<mm.bb<<endl;
cout<<mm.cc<<endl;
}
改变下数据类型,程序运行结果如下:
我们发现,结构体应该是4+30+8=42长度,但实际是48,这是因为double占8字节,内存要为大于42字节的做小的8的整数倍的数,6*8=48。那么联合体也是如此道理啦。