联合体的特点

1、联合体是一种结构,在这个结构中能够不同类型的成员,但同一时间仅仅能存放当中的一种。

#include <stdio.h>

union  Demo
{
int a;
char b;
long long c;
}; int main(){
union Demo demo;
demo.a = 10; printf("a=%d\n", demo.a);
printf("b=%d\n", demo.b);
printf("c=%d\n", demo.c);
return 0;
}



2、联合体全部成员的首地址都是一样的(共享同一块内存空间)。

#include <stdio.h>

union  Demo
{
int a;
char b;
long long c;
}; int main(){
printf("%p\n", &demo.a);
printf("%p\n", &demo.b);
printf("%p\n", &demo.c);
return 0;
}

3、联合体所占的内存的长度,一般等于其最大成员的内存长度。

#include <stdio.h>

union  Demo
{
int a;
char b;
long long c;
}; int main(){
union Demo demo;
printf("%d\n", sizeof(demo));
return 0;
}

4、联合体成员的对齐方式要适合全部的成员。

#include <stdio.h>

union  Demo
{
int a;// 4个字节
char b;// 2个字节
long long c;// 8个字节
char d[11];// 11个字节
}; int main(){
union Demo demo;
printf("%d\n", sizeof(demo));
return 0;
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3VzZXl1a3Vp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">



上面联合体变量demo的大小之所以不是11个字节而是16个字节,是由于这里存在节对齐问题:

11既不能被2整除,也不能被4,、8整除,因此补充字节到16,因此就符合全部成员自身内存对齐了。

这里能够看出联合体所占空间的大小,不仅取决于最大成员的内存大小。并且跟全部成员的数据类型有关系。其大小必须满足两个必须条件:

1、大小足够容纳其最宽的成员。

2、大小能被全部成员类型的大小所整除。

联合体内部指针成员变量

对于联合体来讲最主要的原则是。一次仅仅操作一个成员变量,假设这个变量是指针,那么一定是处理完指针相应的内存之后再来使用其它成员。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3VzZXl1a3Vp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

最新文章

  1. Android开发学习——画横线竖线
  2. Step by step 活动目录中添加一个子域
  3. LATTICE USB下载线接口说明
  4. 【原】iOS动态性(二):运行时runtime初探(强制获取并修改私有变量,强制增加及修改私有方法等)
  5. 《BI项目笔记》SSAS部署时发生的问题——元数据管理器中存在错误 解决办法
  6. IO流-输入输出
  7. 定制类自己的的new_handler
  8. [BZOJ1477]青蛙的约会
  9. HDU-4614 Vases and Flowers (线段树区间更新)
  10. [ActionScript&amp;Flex] FlashBuilder编译条件之如何屏蔽调试代码
  11. 【转】linux设备驱动程序之简单字符设备驱动
  12. C# Debug与release之间的一些小差异
  13. gcc编译选项的循环重复查找依赖库等命令
  14. jQuery(2)——选择器
  15. 玩一玩nodejs--一个简单的在线实时填表应用
  16. js算法集合(一) 水仙花数 及拓展(自幂数的判断)
  17. chrome浏览器解决ajax跨域问题
  18. Laravel View Composer - 当 include 一个模板时,自动获取其所需的变量
  19. 使用Swagger2构建强大的RESTful API文档(2)(二十三)
  20. ubuntu分辨率

热门文章

  1. 从零开始学Xamarin.Forms(三) Android 制作启动画面
  2. 修改linux系统时间、rtc时间以及时间同步
  3. 【Cocos2d-x 粒子系统】火球用手指飞起来
  4. hdu 1394 Minimum Inversion Number(线段树之 单点更新求逆序数)
  5. (23)unity4.6学习Ugui中国文档-------非官方Demo1
  6. hdu1520 (树形dp)
  7. Memcached FAQ
  8. 【翻译自mos文章】回收 asm磁盘空间的方法
  9. 更改Activity的最底层的布局
  10. CareerCup它1.8 串移包括问题