转载自:https://blog.csdn.net/sizhouqun_84342712/article/details/53187106

1.联合体union的基本特性——和struct的同与不同

union,中文名“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。不过区别也挺明显:结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。

2.双刃剑——多种访问内存途径共存

//example

#include

union var{

long int l;

int i;

};

main(){

union var v;

v.l = 5;

printf("v.l is %d\n",v.i);

v.i = 6;

printf("now v.l is %ld! the address is %p\n",v.l,&v.l);

printf("now v.i is %d! the address is %p\n",v.i,&v.i);

}

结果:

v.l is 5

now v.l is 6! the address is 0xbfad1e2c

now v.i is 6! the address is 0xbfad1e2c

3.联合体union和大小端(big-endian、little-endian)

#include

union var{

char c[4];

int i;

};

int main(){

union var data;

data.c[0] = 0x04;//因为是char类型,数字不要太大,算算ascii的范围~

data.c[1] = 0x03;//写成16进制为了方便直接打印内存中的值对比

data.c[2] = 0x02;

data.c[3] = 0x11;

//数组中下标低的,地址也低,按地址从低到高,内存内容依次为:04,03,02,11。总共四字节!

//而把四个字节作为一个整体(不分类型,直接打印十六进制),应该从内存高地址到低地址看,0x11020304,低位04放在低地址上。

printf("%x\n",data.i);

}

结果:

11020304

证明我的32位linux是小端(little-endian)

4.联合体union所占内存空间大小

#include

union sizeTest{

int a;

double b;

};

main(){

union sizeTest unionA;

union sizeTest unionB;

union sizeTest unionC;

printf("the initial address of unionA is %p\n",&unionA);

printf("the initial address of unionB is %p\n",&unionB);

printf("the initial address of unionC is %p\n",&unionC);

}

打印,可以看到结果:

the initial address of unionA is 0xbf9b8df8

the initial address of unionB is 0xbf9b8e00

the initial address of unionC is 0xbf9b8e08

很容易看出,8,0,8,这间隔是8字节,按double走的。

怕不保险,再改一下,把int改成数组,其他不变:

union sizeTest{

int a[10];

double b;

};

打印

the initial address of unionA is 0xbfbb7738

the initial address of unionB is 0xbfbb7760

the initial address of unionC is 0xbfbb7788

88-60=28

60-38=28

算错了?我说的可是16进制0x。那么0x28就是40个字节,正好是数组a的大小。

似乎忘了一个功能——sizeof()   用sizeof直接看,就知道union的大小了

printf("the sizeof of unionA is %d\n",sizeof(unionA));

printf("the sizeof of unionB is %d\n",sizeof(unionB));

printf("the sizeof of unionC is %d\n",sizeof(unionC));

printf("the sizeof of union is %d\n",sizeof(union sizeTest));

5.联合体union适用场合

有了前边那个验证,基本可以确认,union的内存是照着里边占地儿最大的那个变量分的。

也就可以大胆的推测一下,这种union的使用场合,是各数据类型各变量占用空间差不多并且对各变量同时使用要求不高的场合(单从内存使用上,我觉得没错)。

像上边做的第二个测试,一个数组(或者更大的数组int a[100]),和一个或者几个小变量写在一个union里,实在没什么必要,节省的空间太有限了,还增加了一些风险(最少有前边提到的逻辑上的风险)。所以,从内存占用分析,这种情况不如直接struct。

不过话说回来,某些情况下虽然不是很节约内存空间,但是union的复用性优势依然存在啊,比如方便多命名,这种“二义性”,从某些方面也可能是优势。这种方法还有个好处,就是某些寄存器或通道大小有限制的情况下,可以分多次搬运。

6.本质&进阶

没错,union的成员变量是相当于开辟了几个接口(即union包含的变量)!但是,没开辟就不能用了?当然也能用!  写个小测试:

#include

union u{

int i;

double d;//这个union有8字节大小

};

main(){

union u uu;

uu.i = 10;

printf("%d\n",uu.i);

char * c;

c = (char *)&uu;//把union的首地址赋值、强转成char类型

c[0] = 'a';

c[1] = 'b';

c[2] = 'c';

c[3] = '\0';

c[4] = 'd';

c[5] = 'e';

//最多能到c[7]

printf("%s\n",c);//利用结束符'\0'打印字符串"abc"

printf("%c %c %c %c %c %c\n",c[0],c[1],c[2],c[3],c[4],c[5]);

}

java c语言union转换_C语言联合体(union)的使用方法及其本质-union相关推荐

  1. C语言字母转十进制,c语言十进制转换_C语言 字符串转换成十进制整数

    最佳答案 这道题不算难,就是筛选除了a,b,c,d,e,f和数字之外的所有字符,然后把十六进制数转换为十进制数,你等我写一下程序再发上来.追答: #include #include = "0 ...

  2. java c语言与人工智能_C语言与LISP语言的区别

    C语言:C是过程式编程语言.它被设计成使用编译器编译.该语言有少量固定数量的关键字,如if/else,for,while,..等等.我们可以使用一个以上的作业,可以用这种语言在一个语句中使用.函数也在 ...

  3. java和c语言的区别_C语言为何不会过时?你需要掌握多少种语言?

    关注.星标公众号,不错过精彩内容 整理/排版:付斌 转自:嵌入式ARM 01 为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过 ...

  4. window直接运行不需要环境的软件是什么语言开发的_C语言为何不会过时?你需要掌握多少种语言?_C 语言...

    01为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:"s b!"这个在 ...

  5. 1e6在C语言,热电偶转换C语言程序

    <热电偶转换C语言程序>由会员分享,可在线阅读,更多相关<热电偶转换C语言程序(17页珍藏版)>请在人人文库网上搜索. 1.include#include #define ER ...

  6. c语言命名规则_C语言的基本数据类型及变量

    学习目标 了解C语言的基本数据类型 了解变量的基本概念 了解变量的使用方法 了解了变量的命名方法 了解格式占位符 了解变量的输出 了解C语言程序的基本数据类型及概念的使用方法擦 在C语言编程中,系统定 ...

  7. c语言求素数_C语言 | 求100~200的素数

    "要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人-万中无一" --包租婆这道理放在C语言学习上也一并受用.在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语 ...

  8. c语言实现通讯录_C语言实现双人猜数字游戏

    点击上方"学士科技",选择"设为星标" 资讯.技术干货第一时间送达! C语言合集(基础.进阶.高级)通通有,点我点我      C语言实例 01.C语言编写简单 ...

  9. c语言c99标准_C语言的三套标准:C89、C99和C11

    我们今天使用的 Windows.Linux.Mac OS 等操作系统都是由一种叫做 Unix 的系统演化而来.Unix 作为80年代主流的操作系统,是整个软件工业的基础,是现代操作系统的开山鼻祖,C语 ...

最新文章

  1. 网警信息安全!_只愿与一人十指紧扣_新浪博客
  2. 客户端JavaScript加密数据,服务端Java解密数据
  3. 第7周项目实践2.1 用只有尾节点指针rear的循环单链表实现队列算法库
  4. 中国殡葬行业投资战略建议与前景策略分析报告2022-2028年版
  5. java 位运算符赋值_java-运算符(算术、赋值 =、关系、逻辑、三元、位运算符)...
  6. php无法post,PHP无法获得post数据
  7. 《结对-贪吃蛇-需求分析》
  8. Android11 下载APK并安装
  9. 什么是java框架结构_Java框架概述
  10. 同济版《工程数学:线性代数》60条笔记全整理
  11. win10系统小键盘数字键不能用怎么办
  12. 数据开发常用的几种数据预处理和数据整理方法
  13. Like My Mother Always Said… by Erin McHugh
  14. 【转】js高德地图图标合集
  15. VBS对Excel导入bas宏文件
  16. Lesson 3 Please send me a card 请给我寄一张明信片
  17. 多段线简化算法,看这一篇就够了
  18. 1、计算机毕业设计论文分析-班主任管理系统
  19. Amazon推新送货无人机Prime Air
  20. 计算机提升反思的相关文档,反思教学论文,关于教学反思在提升高校计算机专业青年教师教学水平中的应用相关参考文献资料-免费论文范文...

热门文章

  1. access根据所属院系修改学号_五个access管理系统实用范例整合
  2. pythonjam怎么运行_第二十一天 PYTHON学习
  3. win11+AMD的cpu+3060GPU电脑安装 tensorflow-GPU+cuda11+cudnn
  4. Java 编程语言中很少被人了解的特性-statement label
  5. 使用Java API创建(create),查看(describe),列举(list),删除(delete)Kafka主题(Topic)--转载...
  6. Example of how to use both JDK 7 and JDK 8 in one build.--reference
  7. Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化(Regularization)”
  8. 机器学习入门系列三(关键词:逻辑回归,正则化)
  9. 互联网技术架构的启示
  10. 记一次mongoDB-@Document(collection = “XXX“)配置的探索