联合(union)的最详细用法


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

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

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

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


一个简单程序的分析

#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

#include<stdio.h>  
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

    #include<stdio.h>  
    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]);  
    }  

输出

10
abc
a b c  d e

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

程序分析4

main()

{
   struct
   {
      char name[10];
      int age;
      char job;
      union
      {
         int class;
         char office[10];
      } depa;
   }body[2];
   
  int n,i;
   for(i=0;i<2;i++)
   {
      printf("input name,age,job and department\n");
      scanf("%s %d %c",body[i].name,&body[i].age,&body[i].job);
      if(body[i].job=='s')
         scanf("%d",&body[i].depa.class);
      else
         scanf("%s",body[i].depa.office);
   }
   printf("name\tage job class/office\n");
   for(i=0;i<2;i++)
   {
   if(body[i].job=='s')
      printf("%s\t%3d %3c %d\n",body[i].name,body[i].age ,body[i].job,body[i].depa.class);
   else
      printf("%s\t%3d %3c %s\n",body[i].name,body[i].age, body[i].job,body[i].depa.office);
   }
}


  • 54
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值