现在的位置: 首页 > 综合 > 正文

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

2017年12月14日 ⁄ 综合 ⁄ 共 1189字 ⁄ 字号 评论关闭

联合体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。因为u1s9字节,n4字节,d8字节,因此至少需要9字节。其包含的基本数据类型为charintdouble分别占148字节,为了使u1所占空间的大小能被148整除,则需填充字节以到16,因此sizeof(u1)=16.

对u1.n=1,将u1的n赋值为1后,则该段内存的前4个字节存储的数据为00000001 00000000 0000000000000000

因此取s[0]的数据表示取第一个单元的数据,其整型值为1,所以打印出的结果为1.

 

 

抱歉!评论已关闭.