目录
一.什么是共用体
共用体(有的资料也叫联合体,)和结构体很像,也可以包含多个不同类型的成员。但是行为方式和结构体完全不同。
我们先看共用体的语法格式。
二.语法格式
共用体的定义与结构体非常相似。只要把struct变成union就是共用体。
声明:
union 共用体名称
{
共用体成员1;
共用体成员2;
共用体成员3;
...
};
如:
union data
{
int a;
char b
};
也可以在声明的同时定义共用体变量
union 共用体名称
{
共用体成员1;
共用体成员2;
共用体成员3;
...
}a,b,c;
也可以分开定义:
共用体名称 变量名字
如
union data a = {1}; //一次只初始化一个成员
union data b = a; //用一个共用体初始化另一个共用体
union data c = {
.b = 'A', //指定初始化成员b
}
//使用点运算符(.)为共用体成员赋值或访问
三.区别
我们都知道,在定义变量的时候会在内存中申请空间。结构体变量也不例外。在定义结构体变量的时候会给每个成员申请空间。
但是共用体的所有成员是共享一个内存地址。(相当于多个人共用一个身体,但是多个人不会同时出现,只能不断切换。人格分裂?)
例1:
#include <stdio.h>
#include <string.h>
union student
{
int year;
char name[20];
};
int main(void)
{
union student stu;
stu.year = 18;
strcpy(stu.name,"xiaoming");
printf("stu.year addr is %p\n",&stu.year);
printf("stu.name addr is %p\n",&stu.name);
return 0;
}
运行结果:
例2:
#include <stdio.h>
#include <string.h>
union student
{
int year;
char name[20];
};
int main(void)
{
union student stu;
stu.year = 18;
strcpy(stu.name,"xiaoming");
printf("stu.year addr is %p\n",&stu.year);
printf("stu.name addr is %p\n",&stu.name);
printf("stu.name year is %d\n",stu.year);
printf("stu.name value is %s\n",stu.name);
return 0;
}
运行结果:
因为共用一个地址,所以在赋值的时候会互相覆盖,所以只有最后一个值可以打印成功。
注意:共用体类型的变量占用内存空间的大小等于成员分量中最长的分量所占用内存的长度
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。