目录

一、共用体数据类型的定义

二、共用体变量的定义

三、共用体内存分配

四、共用体变量的初始化和引用


一、共用体数据类型的定义

共用体类型同结构体类型一样,都属于构造类型,它在定义上与结构体类型十分相似,定义共用体类型的语法格式如下:

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字节。

【C语言】共用体的定义与使用-编程知识网

②成员变量包含数组类型的共用体

union 
{
    int m;
    float x;
    char c;
    char str[5];
}b;

共用体b的最大数据类型为char str[5]来分配的,但它的大小是5字节,不满足原则(2),必须是最大基本数据类型的整数倍,所以填充3字节,共8字节。

【C语言】共用体的定义与使用-编程知识网


四、共用体变量的初始化和引用

在共用体变量的定义的同时,只能对其中一个成员的类型值进行初始化,这与它的内存分配也是响应的。

共用体变量初始化的格式如下:

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");}
}

运行结果:

【C语言】共用体的定义与使用-编程知识网