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