共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。
定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。
共用体提供了一种使用相同的内存位置的有效方式。
13.1 union 语句
使用 union 语句,方式与定义结构类似。
union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:
union[union tag]
{
member definition;
member definition;
...
member definition;
}[one or more union variables];
union tag 是可选的,每个 member definition 是标准的变量定义,比如 int i; 或者 float f;
或者其他有效的变量定义。
在共用体定义的末尾,最后一个分号之前,可以指定一个或多个共用体变量,这是可选的。
union Data
{
int i;
float f;
char str[20];
} data;
Data 类型的变量可以存储一个整数、一个浮点数,或者一个字符串。
这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。
可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。
共用体占用的内存应足够存储共用体中最大的成员。
在上面的实例中,Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。
13.2 访问共用体成员
为了访问共用体的成员,使用成员访问运算符(.)。
#include <stdio.h>
/*-----------------------------------------------------------------------*/
/* 创建共用体 */
union Data
{
int i;
float f;
char str[20];
};
/*-----------------------------------------------------------------------*/
/*
* @brief
* 关于 main 的功能描述:
* 使用共用体‘union’,做相关共用体的操作.
* @param[in] void
*
* @return return 0
*
* @implements 低层需求标识号 XXXX
*/
int main()
{
union Data data;
data.i = 10;
printf("data.i : %d\n", data.i);
data.f = 12.5;
printf("data.f : %f\n", data.f);
strcpy(data.str, "C Program!");
printf("data.str : %s\n", data.str);
return 0;
}
/*-----------------------------------------------------------------------*/
Visual Studio 运行结果:
13.3 共用体的使用
有若干人的数据,老师和学生。
学生包括:姓名、号码、性别、职业、班级;
老师数据包括:姓名、号码、性别、职业、职务;
要求用同一个表格来处理
num |
name |
sex |
job |
class |
101 |
Li |
f |
s |
501 |
102 |
Wang |
m |
t |
prof |
/*-----------------------------------------------------------------------*/
#include <stdio.h>
/*-----------------------------------------------------------------------*/
/* 创建结构体 */
union Category //声明无名共用体类型
{
int clas; //成员clas
char position[10]; //成员position
}; //成员category是共用体变量
struct //声明无名结构体类型
{
int num; //成员 num
char name[10];
char sex;
char job;
union Category category;
}person[2]; //定义结构体数组person,有两个元素
/*-----------------------------------------------------------------------*/
/*
* @brief
* 关于 main 的功能描述:
* 有若干人的数据,老师和学生,
* 要求用同一个表格来处理.
* @param[in] void
*
* @return return 0
*
* @implements 低层需求标识号 XXXX
*/
int main()
{
int i;
for (i = 0; i<2; i++)
{
printf("please enter the data of person:\n");
scanf("%d %s %c %c", &person[i].num, &person[i].name,&person[i].sex, &person[i].job); //输入前4项
if (person[i].job == 's') //如果是学生,输入班级
scanf("%d", &person[i].category.clas);
else if (person[i].job == 't') //如果是老师,输入职务
scanf("%s", person[i].category.position);
else
printf("Input error!");
}
printf("\n");
printf("No. name sex job class/position\n");
for (i = 0; i<2; i++)
{
if (person[i].job == 's')
printf("%-6d%-10s%-4c%-4c%-10d\n", person[i].num, person[i].name,person[i].sex, person[i].job, person[i].category.clas);
else
printf("%-6d%-10s%-4c%-4c%-10s\n", person[i].num, person[i].name,person[i].sex, person[i].job, person[i].category.position);
}
return 0;
}
/*-----------------------------------------------------------------------*/
Visual Studio 运行结果:
非常感谢您的支持!创作不易,转发备注出处!
自用展示内容,不定期更新维护内容,让我们把 C开发 变得更专业。
十年开发基本功,常年开班收徒(一年学徒制度),每年10个名额。
商业合作加微信,项目接包与外包。