首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-09-29 
c\c++ 复习基础要点06---联合体联合体union 当多个数据需要共享内存或者多个数据每次只取其一的时候,可以

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.

 

 

热点排行