目录
一、共用体数据类型的定义
共用体类型同结构体类型一样,都属于构造类型,它在定义上与结构体类型十分相似,定义共用体类型的语法格式如下:
union 共用体类型名称
{
数据类型 成员1;
数据类型 成员2;
。。。
数据类型 成员n;
};
【注释】union为共用体类型关键字,大括号中定义了共用体类型的成员项,每个成员项由数据类型和成员名组成。
实例解析:
union data
{
int m;
float x;
char c;
};
//定义了一个名为data的共用体类型,该类型由三个不同类型的成员组成,这些成员共享同一块存储空间。
二、共用体变量的定义
(1)先定义共用体类型,在定义共用体变量
union data
{
int m;
float x;
char c;
};
union data a, b;
(2)定义共用体类型的同时定义共用体变量
union data
{
int m;
float x;
char c;
}a, b;
(3)直接定义共用体变量
union
{
int m;
float x;
char c;
}a, b;
三、共用体内存分配
共用体的内存分配必须符合两项原则:
(1)共用体的内存必须大于或等于其他成员变量中最大数据类型(包括基本数据类型和数组)的大小
(2)共用体的内存必须是最宽基本数据类型的整数倍,如果不是,则填充字节。
实例分析:
①成员变量都是基本数据类型的共用体
union data
{
int m;
float x;
char c;
}a;
共用体a的内存大小是最大数据类型所占的字节数,即int和float的大小,所以a的内存大小为4字节。
②成员变量包含数组类型的共用体
union
{
int m;
float x;
char c;
char str[5];
}b;
共用体b的最大数据类型为char str[5]来分配的,但它的大小是5字节,不满足原则(2),必须是最大基本数据类型的整数倍,所以填充3字节,共8字节。
四、共用体变量的初始化和引用
在共用体变量的定义的同时,只能对其中一个成员的类型值进行初始化,这与它的内存分配也是响应的。
共用体变量初始化的格式如下:
union 共用体类型 共用体变量={其中一个成员的类型值};
//必须用大括号括起来
完成共用体变量的初始化后,就可以引用共用体中的成员,共用体变量的引用与结构体类似,有直接引用和间接引用两种。
实例演示:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Person
{
char name[20];
char role[20];
union
{
char classroom[20];
char office[20];
}dept;
}person[3];
int main() {
for (int i = 0; i < 3; i++) {
printf("please input your information:NO.%d\n", i + 1);
printf("Name:");
scanf("%s", &person[i].name);
getchar();
printf("Role:");
scanf("%s", &person[i].role);
getchar();
if (strcmp(person[i].role, "student")==0) {
printf("Classroom:");
getchar();
scanf("%s", &person[i].dept.classroom);
}
else if (strcmp(person[i].role, "teacher") == 0) {
printf("Office:");
getchar();
scanf("%s", &person[i].dept.office);
}
getchar();
}
for (int i = 0; i < 3; i++) {
printf("please input your information:NO.%3d\n", i + 1);
printf("\tName:%6s",person[i].name);
printf("\tRole:%10s",person[i].role);
if (strcmp(person[i].role, "student") == 0) {
printf("\tClassroom:%s",person[i].dept.classroom);
}
else if (strcmp(person[i].role, "teacher") == 0) {
printf("\tOffice:%6s",person[i].dept.office);
}
printf("\n");
}
}
运行结果: