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