【C语言】共用体的定义与使用

目录

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

二、共用体变量的定义

三、共用体内存分配

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


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

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

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

运行结果:

猜你喜欢

转载自blog.csdn.net/Jacky_Feng/article/details/109219560