经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C语言 联合(union)用法案例详解
来源:jb51  时间:2021/8/26 17:21:15  对本文有异议

联合(union)的声明和结构与结构体类似,但是本质不同。

   联合的所有成员引用的是内存中的相同位置。当你想在不同时刻把不同的东西存储于同一位置时,就可以使用联合。

  构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。

  而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。

一个简单程序的分析

  1. #include "stdio.h"
  2. union{
  3. int a;
  4. float b;
  5. char c;
  6. }x;
  7. int main()
  8. {
  9. x.c='x';
  10. x.b=3.14;
  11. x.a=25;
  12. printf("%g \t%c \t %d\t\n",x.b,x.c,x.a);
  13. return 0;
  14. }

输出结果为 3.50325e-44       垃圾值     25 

可以看出  只有最后一个x.a=25; 因为x.b会把x.c的地址覆盖x.a会把x.b的地址覆盖  所以前两个打印的都是垃圾值只有最后一个打印正确。

  程序分析2

  1. #include<stdio.h>
  2. union var{
  3. long int l;
  4. int i;
  5. };
  6. main(){
  7. union var v;
  8. v.l = 5;
  9. printf("v.l is %d\n",v.i);
  10. v.i = 6;
  11. printf("now v.l is %ld! the address is %p\n",v.l,&v.l);
  12. printf("now v.i is %d! the address is %p\n",v.i,&v.i);
  13. }
  14. //结果:
  15. //v.l is 5
  16. //now v.l is 6! the address is 0xbfad1e2c
  17. //now v.i is 6! the address is 0xbfad1e2c

程序分析3

  1. #include<stdio.h>
  2. union u{
  3. int i;
  4. double d;//这个union有8字节大小
  5. };
  6. main(){
  7. union u uu;
  8. uu.i = 10;
  9. printf("%d\n",uu.i);
  10. char * c;
  11. c = (char *)&uu;//把union的首地址赋值、强转成char类型
  12. c[0] = 'a';
  13. c[1] = 'b';
  14. c[2] = 'c';
  15. c[3] = '\0';
  16. c[4] = 'd';
  17. c[5] = 'e';
  18. //最多能到c[7]
  19. printf("%s\n",c);//利用结束符'\0'打印字符串"abc"
  20. printf("%c %c %c %c %c %c\n",c[0],c[1],c[2],c[3],c[4],c[5]);
  21. }

输出

10
abc
a b c  d e

  1. printf("%s\n",c);//利用结束符'\0'打印字符串"abc" 字符串以‘\0'结束所以后面未打印

程序分析4

  1. main()
  2. {
  3. struct
  4. {
  5. char name[10];
  6. int age;
  7. char job;
  8. union
  9. {
  10. int class;
  11. char office[10];
  12. } depa;
  13. }body[2];
  14.   int n,i;
  15. for(i=0;i<2;i++)
  16. {
  17. printf("input name,age,job and department\n");
  18. scanf("%s %d %c",body[i].name,&body[i].age,&body[i].job);
  19. if(body[i].job=='s')
  20. scanf("%d",&body[i].depa.class);
  21. else
  22. scanf("%s",body[i].depa.office);
  23. }
  24. printf("name\tage job class/office\n");
  25. for(i=0;i<2;i++)
  26. {
  27. if(body[i].job=='s')
  28. printf("%s\t%3d %3c %d\n",body[i].name,body[i].age ,body[i].job,body[i].depa.class);
  29. else
  30. printf("%s\t%3d %3c %s\n",body[i].name,body[i].age, body[i].job,body[i].depa.office);
  31. }
  32. }

到此这篇关于C语言 联合(union)用法案例详解的文章就介绍到这了,更多相关C语言 联合(union)用法内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号