联合(union)的最详细用法
2017-08-23 10:43
316 查看
联合(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
程序分析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)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是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); } }
相关文章推荐
- union联合 数据类型 详细说明
- union联合 数据类型 详细说明
- 联合(union)用法
- C++ 中联合(union)用法
- 联合(union)用法
- 联合(union)用法
- 联合(union)用法
- C语言中union联合的用法详解
- C中联合(union)用法
- 联合查询Union,Intersect,Except用法
- SQL中UNION和UNION ALL的详细用法
- 联合(union)用法
- 联合(union)用法
- C++ union(联合/共用体)用法 转
- 联合(union)用法(转载)
- 联合(union)用法
- 联合(union)用法(转载)
- union联合 数据类型 详细说明
- 联合(union)用法
- 联合(union)用法