当前位置:编程学习 > C/C++ >>

c\c++ 复习基础要点06---联合体

联合体union
 
当多个数据需要共享内存或者多个数据每次只取其一的时候,可以利用联合体。
1.      联合体是个结构;
2.      它的所有成员对于基地址的偏移量都为0;
3.      联合体的结构空间要大到足够容纳最“宽”的成员;
4.      其对齐方式要适合其中所有成员;
 
由于联合体中的所有成员是共享一段内存的,因此每个成员存放的首地址相对与联合体变量的地址的偏移量都为0,则所有成员的首地址都是一样的。为了使得所有成员能共享一段内存,因此该内存空间的大小必须能够容纳成员中最大的成员。
 
例子:
union text
{
     chars[9];
    int  n;
    double  d;
};
 
S占9个字节,n占4个字节,d占8个字节,因此至少需要9个字节的内存空间,但是其实该联合体的大小并不是9个字节,用sizeof计算出该联合体的大小为16。从这里可以看出联合体所占的内存空间不仅取决于最大的成员,还跟所有成员相关,即其大小必须满足两个条件:
1.      大小足够容纳最大成员;
2.      大小能被其包含的所有基本数据类型的大小所整除。
 
 
#include<iostream>
 
 
union u
{
       chars[9];
       int  i;
       doubled;
};
 
int main()
{
       unionu u1;
       printf("%d\n",sizeof(u1));
       printf("0x%x\n",&u1);
       printf("0x%x\n",&u1.s);
       printf("0x%x\n",&u1.i);
       printf("0x%x\n",&u1.d);
       u1.i=1;
       printf("%d\n",u1.s[0]);
//     printf("0x%x\n",u1.s[0]);
       unsignedchar *p=(unsigned char *)(&u1);
       printf("%d\n",*p);
       printf("%d\n",*(p+1));
       return0;
 
}
 
输出结果:
16
0x18ff38
0x18ff38
0x18ff38
1
1
0
 
 
对于sizeof(u1)=16。因为u1中s占9字节,n占4字节,d占8字节,因此至少需要9字节。其包含的基本数据类型为char,int,double分别占1,4,8字节,为了使u1所占空间的大小能被1,4,8整除,则需填充字节以到16,因此sizeof(u1)=16.
对u1.n=1,将u1的n赋值为1后,则该段内存的前4个字节存储的数据为00000001 00000000 0000000000000000
因此取s[0]的数据表示取第一个单元的数据,其整型值为1,所以打印出的结果为1.
 
 
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,