8.5 联合体共用体

对比结构体:不同类型的变量拥有自己的内存空间,而联合体是在一片空间内,既可以存放int、char、double……不同类型的数据共享同一片空间。

        结构体元素有各自单独空间;共用体元素共享空间,空间大小由最大类型确定。

        结构体元素互不影响 ;共用体赋值会导致覆盖。

#include 

struct Test_S
{
	int idata;    //int类型大小为4字节
	char cdata;    //char类型大小为1字节
	double ddata;    //double类型大小为8字节
};

union Test_U

{
	int idata;
	char cdata;
	double ddata;
};

int main(){
	struct Test_S S1;
	union Test_U U1;
	printf("结构体S1的大小是:%d\n",sizeof(S1));
	printf("结构体T1的大小是:%d\n",sizeof(U1));
	return 0;
}

 输出结果:

联合体占用的内存大小取决于最大空间类型元素

结构体S1的大小是:16
结构体T1的大小是:8

打印结构体和联合体的地址:

	printf("idata:%p\n",&S1.idata);
	printf("cdata:%p\n",&S1.cdata);
	printf("ddata:%p\n",&S1.ddata);
	
	printf("idata:%p\n",&U1.idata);
	printf("cdata:%p\n",&U1.cdata);
	printf("ddata:%p\n",&U1.ddata);

打印结果:

结构体是跨度为4的连续内存空间,而联合体则为相同的内存地址

idata:000000000061FE10
cdata:000000000061FE14
ddata:000000000061FE18

idata:000000000061FE08
cdata:000000000061FE08
ddata:000000000061FE08

注意数据覆盖:

联合体共用一个内存空间,使用每当调用联合体时,里面的内存会被新的数据覆盖

U1.idata = 10;
U1.ddata = 20;
U1.cdata = 'a';
	
printf("idata:%d\n",U1.idata);

结果:

idata:97

案例:

有若干个人员的数据,其中有教师和学生,学生的数据包括:姓名、号码、性别、职业、班级。教师的数据包括:号码、性别、职业、职务。要求用同一个表格来处理。

#include 

struct Person
{
	char name[32];
	int age;
	char caree;
	char addr[32];
	union Data{
		int class;
		char subject[12];
	}mes;						//声明的同时定义变量,这里定义一个m名为mes的变量
};

int main()
{
	struct Person p[2];
	int i;
	for(i=0;i<2;i++){
		printf("请输入职业:t代表老师,s代表学生\n");
		scanf("%c",&(p[i].caree));
		if(p[i].caree =='s'){
			printf("请输入学生班级:\n");
			scanf("%d",&(p[i].mes.class));
			printf("请输入学生名字:\n");
			scanf("%s",p[i].name);
			
		}else{
			printf("请输入老师科目:\n");
			scanf("%s",&(p[i].mes.subject));
			printf("请输入老师名字:\n");
			scanf("%s",p[i].name);
		}	
		getchar();	
	}
	
	
		for(i=0;i<2;i++){
			if(p[i].caree=='s'){
			printf("学生的名字是:%s,班级是%d\n",p[i].name,p[i].mes.class);
			
			}else{
				printf("老师的名字是:%s,科目是%s\n",p[i].name,p[i].mes.subject);
			}
			
		}
      return 0;
}

你可能感兴趣的:(c语言)