C语言的共用体

导读:本篇文章讲解 C语言的共用体,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

基本介绍

  • 共用体属于构造类型,它可以包含多个类型不同的成员
  • 共用体有时也被称为联合或者联合体
union 共用体名{
    成员列表
};
  • 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员
#include <stdio.h>

union data{ // data 就是一个共用体(内存布局), 包含三个成员, 共享数据空间, 该空间的大小以占用最大的成员为准
	int n;
	char ch;
	short m;
};
void main(){

	union data a; //定义两个一个 共用体变量  a

	//sizeof(a)表示共用体占用的空间,sizeof(union data) 也是
	printf("%d, %d\n", sizeof(a), sizeof(union data) ); // 4, 4

	a.n = 0x40;//16进制
	printf("%d, %c, %d\n", a.n, a.ch, a.m);//64	 @  64
	a.ch = '9'; //9的ASCII码值是57
	printf("%d, %c, %d\n", a.n, a.ch, a.m);//57  9  57
	a.m = 0x2059;
	printf("%d, %c, %d\n", a.n, a.ch, a.m);//8281  Y  8281
	a.n = 0x3E25AD54;
	printf("%d, %c, %d\n", a.n, a.ch, a.m);//1042656596  T  -21164
	getchar();
}

共用体所占的内存空间大小为4字节(int)

但是char类型只占1个字节,short类型占用2字节,所以我们只输出最后的一个或两个字节的内容,但是修改输入数据的时候,是按照最大的字节长度来输入的

 共用体的实践

C语言的共用体

定义一个结构体数组

struct Person persons[TOTAL]; // 定义了一个结构体数组 

共用体的定义及输出

union{  
	float score;
	char course[20];
} sc;//sc 是一个共用体变量
if(persons[i].profession == 's'){  //如果是学生
			printf("%s\t\t%d\t%c\t%c\t\t%f\n", persons[i].name, persons[i].num, persons[i].sex, persons[i].profession, persons[i].sc.score);
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define TOTAL 2  //人员总数


//定义了一个结构体 Person

//union MYUNION {
//	float score;
//	char course[20];
//};

struct Person{
	char name[20]; //name
	int num; //编号
	char sex;//性别 f => 女 m=>男
	char profession;//职员 s=>学生 t=>老师
	union{  
		float score;
		char course[20];
	} sc;//sc 是一个共用体变量
	//union MYUNION sc;
};


void main(){
	int i;
	struct Person persons[TOTAL]; // 定义了一个结构体数组 
	//输入人员信息
	for(i=0; i<TOTAL; i++){
		printf("Input info: ");
		scanf("%s %d %c %c", persons[i].name, &(persons[i].num), &(persons[i].sex), &(persons[i].profession));
		if(persons[i].profession == 's'){  //如果是学生
			printf("请输入该学生成绩:");
			scanf("%f", &persons[i].sc.score);
		}else{  //如果是老师
			printf("请输入该老师课程:");
			scanf("%s", persons[i].sc.course);
		}
		fflush(stdin);//刷新
	}
	//输出人员信息
	printf("\nName\t\tNum\tSex\tProfession\tScore / Course\n");
	for(i=0; i<TOTAL; i++){
		if(persons[i].profession == 's'){  //如果是学生
			printf("%s\t\t%d\t%c\t%c\t\t%f\n", persons[i].name, persons[i].num, persons[i].sex, persons[i].profession, persons[i].sc.score);
		}else{  //如果是老师
			printf("%s\t\t%d\t%c\t%c\t\t%s\n", persons[i].name, persons[i].num, persons[i].sex, persons[i].profession, persons[i].sc.course);
		}
	}
	getchar();
	getchar();
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/83258.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!