服务器之家

服务器之家 > 正文

C语言 联合(union)用法案例详解

时间:2021-12-23 14:44     来源/作者:时光漫走

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

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

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

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

一个简单程序的分析

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

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

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

  程序分析2

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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

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

程序分析4

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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);
   }
}

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

原文链接:https://blog.csdn.net/asn1111/article/details/77503025

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部