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语言的共用体
下一篇: RT-Thread线程
推荐阅读
-
C语言中的共用体(union)和枚举(enum)
-
C语言中的enum、struct、union——枚举类型、结构体、共用体
-
C语言集锦 | 03 - C语言的复合数据类型(typedef关键字、结构体、枚举体、共用体)
-
C语言 枚举(enum)、宏定义(#define)、结构体(struct)的一种联合应用
-
C语言 枚举enum、宏定义#define、结构体struct的一种联合应用
-
C语言中的共用体(union)和枚举(enum)
-
C++中的共用体(union)结构解析与结构体(struct)共用体(union) 的区别
-
C语言集锦 | 03 - C语言的复合数据类型(typedef关键字、结构体、枚举体、共用体)