一、共用体数据类型的定义
二、共用体变量的定义
三、共用体内存分配
四、共用体变量的初始化和引用
共用体类型同结构体类型一样,都属于构造类型,它在定义上与结构体类型十分相似,定义共用体类型的语法格式如下:
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"); } }运行结果:
