联合(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