联合体(共用体)的引入

联合体的概念

联合体也叫共用体,它是C语言中与结构体类似的数据结构,不同之处在于,联合体共享同一块内存空间,存放不同类型的变量。联合体的内存大小由最大类型元素的空间决定,而结构体每个元素拥有独立空间。下面定义一个联合体和一个结构体,并输出他们的大小和成员们的地址:

#include <stdio.h>

union Testu 
{
	int a;
	char b;
	int c;
};

struct Testt
{
	int a;
	char b;
	int c;
};

int main()
{
	union Testu u1;
	struct Testt t1;

	printf("联合体的大小是:%d\n",sizeof(u1));
	printf("结构体的大小是:%d\n",sizeof(t1));

	printf("联合体成员a的地址是:%p",&u1.a);
	printf("联合体成员b的地址是:%p",&u1.b);
	printf("联合体成员c的地址是:%p",&u1.c);
	
	printf("结构体成员a的地址是:%p",&t1.a);
	printf("结构体成员b的地址是:%p",&t1.b);
	printf("结构体成员c的地址是:%p",&t1.c);
	return 0;
}

在这里插入图片描述

为什么算出来联合体大小为4,而结构体大小而12?

是因为联合体所有成员共享内存,大小为最大成员的大小4(int);而结构体成员依次存储,考虑内存对齐,总大小为 4字节(int)+1字节(char)+3字节(填充)+4字节(int) = 12 字节。

联合体的应用

例如:有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、职业、班级。教师的数据包括:姓名、职业、职务。要求用一个表格来完成。

#include<stdio.h>

struct Person
{
	char name[32];
	int age;
	char occupation;
	union {
		int class;
		char subject[32];
	}mes;
};
int main()
{
	struct Person arr[2];
	int i;
	
	for(i=0;i<2;i++){
		printf("请问你是学生还是教师,是学生就输入s,是老师就输入t。\n");
		scanf("%c",&(arr[i].occupation));
		if(arr[i].occupation == 's'){
			printf("请问你是几班的学生\n");
			scanf("%d",&(arr[i].mes.class));
			
			printf("请问学生的名字\n");
			scanf("%s",arr[i].name);
		}else{
			printf("请问你教什么科目\n");
			scanf("%s",arr[i].mes.subject);
			
			printf("请问老师的名字\n");
			scanf("%s",arr[i].name);
		}
		getchar();
	}
	for(i=0;i<2;i++){
		if(arr[i].occupation == 's'){
			printf("%s是%d班的学生\n",arr[i].name,arr[i].mes.class);
		}else{
			printf("%s是%s老师\n",arr[i].name,arr[i].mes.subject);
		}	
	}
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值