union的读写问题

来源:互联网 发布:数据库管理员要学什么 编辑:程序博客网 时间:2024/05/16 11:04

谈到union这个关键字,相信大家都不陌生,但是对于他的读写方式,原理可能还揣摩的不够,因为这涉及到一些底层的东西,下面我就来帮忙总结一下。

讲到union,就不得不想到struct,首先必须清楚的是,union声明和union变量定义方式都与结构是相似的,形式如下:

union 联合名

{

    数据类型  成员名;

    数据类型  成员名;

    ......

}联合变量名;

例如:

union test

{

    int mint;

    char mchar;

}m_test;

但是底层存储上,联合体和结构体却有天大的区别:结构体里面所有的成员都占用内存,所以结构体的大小等于其有成员大小之和(还要考虑字节对齐);而联合体里面所有的成员公用同一个内存位置,在不同时间保存不同的数据类型和不同长度的变量,但是该联合体的大小等于其成员变量中长度最大的大小。例如:
union test
{
 int minteg;
 char mchar;
}mtest;
void main()

 mtest.minteg = 2;
 mtest.mchar = 'a';
 cout << mtest.minteg << " " << mtest.mchar

         << " " << sizeof(mtest) << endl;  
}

输出的结果为  97  a  4;因为最后赋值的是联合体里面的mchar变量,他将覆盖之前的给minteg所赋值,所以打印出来的minteg就是字符a的ASCII码值,而其大小为int的大小。所以对于联合的不同成员赋值, 将会对其它成员重写,  原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。


0 0