欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言中的enum、struct、union——枚举类型、结构体、共用体

程序员文章站 2022-07-11 18:52:49
...

enum枚举类型

  • 枚举应用:在实际中,有些值无论数值或者字符型的,取值在一个固定范围内,设计者提前知道其取值,但是每个变量只能取其中之一的值,这时可以考虑使用枚举类型。例如:一周有七天;一周有12门课,访问数据类型指定为固定的几个类型。这些都可以使用枚举类型。
  • 枚举定义: enum 枚举类型名{枚举元素1,枚举元素2,枚举元素3…};
  • 枚举变量的声明:同结构体和联合体一样,枚举变量也可以用不同的方式说明,即先声明后定义或者直接在声明时定义。
enum weekend {Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};
enum weekend a,b,c;(c语言和oc都需要在weekend前面加enum,但C++可以不写)
或者为:
enum weekend{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday } a,b,c;
  • 枚举赋值问题:若设计者不指明枚举元素值,则编译器默认枚举的第一个元素是0,后面的元素依次加1,所以输出枚举变量我们可以使用%d输出为整数。也可以定义枚举时对其中的元素进行幅值,没被幅值的元素由前一元素加1得到。
enum weekend{Monday = 2,Tuesday,Wednesday = 4,Thursday,Friday = 9,Saturday,Sunday } a = Tuesday,b = Sunday,c = Saturday;
printf("%d--%d---%d\n",a,b,c); //输出依次是3--11--10
  • 枚举注意点:1)枚举元素只能在定义枚举时对其幅值,在定义之外时不能再次幅值.如:Monday = 3是错误的,编译器会报错;2)有些人认为枚举元素既然默认的是0,1,2,3,,,值,那么定义枚举变量时直接幅值为整数,这样就可以代替枚举元素,这个是错误的.枚举类型和整型都是基本类型,是2个不同的类型数据,不能直接幅值,要幅值必须加强制转换语句;a = (enum weekend)2;//a = Monday;3)枚举元素不是字符常量也不是字符串常量,不要被它的外表蒙骗了,使用时不能加单、双引号;4)枚举元素之间要使用逗号’,'分开,因为是一个一个的罗列出值;枚举元素要用大括号{}包起来,不能使用[]。

struct结构体类型

  • 有时用户需要将不同类型的数据结合到一起,这时我们不能使用数组,因为数组必须是同一类型的数据,这样就诞生了结构体类型,结构体使我们把有相互联系的不同类型的数据组合到一起,它相当于高级语言中的记录。定义一个结构体类型的两种形式:一种是声明和定义一起;另一种是声明和定义分开。
    • struct 结构体类型名{类型1 成员1;类型2 成员2;…}结构体变量名;
    • struct 结构体类型名{类型1 成员1;类型2 成员2;…}; struct 类型名 结构体变量名;(C++可以省略struct 关键字)。

union共用体类型

  • 有时我们需要使几种不同类型的变量存放在同一内存单元中。例如,把一个整型变量、一个字符型变量、一个双精度型变量放在同一个地址开始的内存单元。这时我们就可以使用共用体union。共用体类型的一般声明形式:
    • 声明:union 共用体类型名{成员列表};
    • 定义:共用体类型名 共用体变量名; 同样可以在声明共用体类型的同时定义变量。
  • 共用体的特点:
    • 不能引用共用体变量,而只能引用共用体变量的成员;
    • 使用共用体变量时,在每一瞬时只能存放期中一种,而不是同时存放几种,即每一瞬时只有一个成员起作用。
    • 能够访问共用体中最后一次被赋值的成员,在对一个新成员赋值后原有的成员就失去了作用。
    • 共用体变量的地址和它的成员的地址都是同一地址。
    • 不能对共用体变量名赋值,不能企图用变量名来得到一个值;不能再定义共用体变量时对它初始化;不能用共用体变量名做函数参数。

例如:输入人员数据,其中由学生和老师,学生的数据包括:姓名,学号,性别,职业,年级。教师的数据包括姓名,学号,性别,职业,职务。

struct {
	int num;
	char name[10];
	char sex;
	char job;
	union P{
		int grade;
		char position[10];
	} category;
} person[2];
int main() {
	int i;
	for (i=0; i<<span style="font-size: 11px; line-height: normal; font-family: Menlo;">2; i++) {
		scanf("%d %s %c %c",&person[i].num,person[i].name,&person[i].sex,&person[i].job);
		if (person[i].job=='s') {
			scanf("%d",&person[i].category.grade); //若是学生输入年级
		}
		else if(person[i].job=='t')
			scanf("%s",person[i].category.position);//若是教师输入职务
	}
	for (i=0; i<<span style="font-size: 11px; line-height: normal; font-family: Menlo;">2; i++) {
		if (person[i].job=='s') {
			printf("num=%d,name=%s,sex=%c,job=%c,grade=%d\n",person[i].num,person[i].name,person[i].sex,
			person[i].job,person[i].category.grade);
	}
	else
		printf("num=%d,name=%s,sex=%c,job=%c,grade=%s\n",person[i].num,person[i].name,person[i].sex,
		person[i].job,person[i].category.position);
	}
	return 0;
}
相关标签: c语言