概述:
在C语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用,又称联合体。
共用体在定义、说明和使用形式上与结构体相似。两者在本质上的不同仅在于使用你内存的方式上。
共用体定义
union 共用体名
{
共用体成员列表;
};
union s1{
int a;
char b;
char c;
};
共用体使用
union 共用体名 变量名;
union 共用体名 变量名 = {成员值};//注意只能是一个
定义共用体时创建变量;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
union A {
int i;
char c;
}a = { 3,'c'};//提示报错
int main() {
printf("%c", a);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct person
{
char name[16];
int age;
char sex;
char phone[12];
};
union un
{
int num;
char ch;
struct person student;
struct person teacher;
//定义共用体时定义变量并赋值
}u2 = { 69 };
int main()
{
//1、定义完共用体变量再赋值
union un u;
u.num = 67;
printf("num = %d ,ch = %c\n", u.num, u.ch);
//2、定义共用体变量时赋值
union un u1 = {
.student.name = "zhangsan",
.student.age = 18,
};
printf("num = %d ,ch = %c\n", u1.num, u1.ch);
printf("name = %s, age = %d\n", u1.student.name, u1.student.age);
printf("num = %d ,ch = %c\n", u2.num, u2.ch);
/*num = 67, ch = C
num = 1851877498, ch = z
name = zhangsan, age = 18
num = 69, ch = E*/
return 0;
}
案例:学校要弄一个全校人员管理系统,里面的数据包括学生和老师的信息。
学生的信息有姓名、年龄、职业和平均成绩。
老师的信息有姓名、年龄、职业和所教学的学科。
如果把平均成绩和学科合成一列,成绩属于 double 类型,学科是 char 数组类型,无论声明哪种类型都无法合成一列。
这种情况就可以使用 union 类型,既可以表示 double 类型的成绩,也可以用来表示 char 类型的学科。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct info_t {
char* name;
int age;
char* role;
union sc_t
{
double score;
char* course;
}sc;
};
int main() {
struct info_t infos[3] = {
{"zs",18,"学生",.sc.score = 94.5},
{"ls",28,"老师",.sc.course = "历史"},
{"ww",17,"学生",.sc.score = 69.5},
};
printf("name = %s,age = %d,role = %s,score = %f\r\n", infos[0].name,
infos[0].age, infos[0].role, infos[0].sc);
printf("name = %s,age = %d,role = %s,cousrse = %s\r\n", infos[1].name,
infos[1].age, infos[1].role, infos[1].sc);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
union u_t
{
int led_status;
int buzzer_status;
};
void fun(void *in_param) {
union u_t* p = in_param;//等价与 union u_t* p = 1
printf("led_status = %d\r\n", p->led_status);//1
printf("buzzer_status = %d\r\n", p->buzzer_status);//1
//这里都指向共同空间,所以值一样
}
int main() {
int led_status = 1;
fun(&led_status);
return 0;
}
共用体大小
空间的大小以占用最大的成员为准
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
union s1 {
int a;
char b;
char c;
};
union s2 {
char a;
int b;
char c;
};
int main() {
printf("%d\n", sizeof(union s1));//4
printf("%d\n", sizeof(union s2));//4
return 0;
}