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。因为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.

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值