C语言:构造类型(补充)
枚举类型
如果定义不相干的常量,使用宏定义;如果需要定义一组相关的常量,使用枚举。
定义:
我们一般情况下,定义常量使用宏定义(#define 宏名称值),宏定义非常适合没有关联关系的常量;但是有时候我们可能需要一组拥有关联关系的量进行定义,比如:
周一~周日、1月~12月、方向(上下左右)等
,那么使用宏定义,就不是很清晰明了,这个时候就需要用到枚举。枚举的存在就是将多个拥有关系的常量组合到一起,提高代码可读性。
说明:
枚举类型定义了一组常量,在开发应用中可以直接使用这些常量。(常用)
枚举类型也可以是类似于结构体一样定义变量等操作。(不常用)
枚举常量有默认值,从0开始依次+1;我们可以在定义时指定它的默认值,如果个别没有赋值,可以根据赋值依次+1计算推导。
特点:
定义了一组常量,类似于定义了多个自定义常量(宏定义)
语法:
定义枚举类型名以后就可以定义该枚举类型的变量。
enum 枚举类型名,变量列表;
在定义枚举类型的同时定义该枚举类型的变量
enum 枚举类型名{枚举元素列表} 变量列表;
直接定义枚举变量
enum {枚举元素列表} 变量列表;
案例:
#include <stdio.h> void test1() { // 定义一个枚举类型 // 枚举类型名一般首字母大写,主要是根枚举变量区分 enum Week { // 定义枚举元素,元素命名要符合标识符命名规则,同时采用大写字母+下划线方式命名 SUN = 10, MON, TUE, WED, THU, FRI, SAT }; // 1.直接访问枚举元素 printf("%d,%d,%d\n", SUN, WED, SAT); // 2.定义枚举类型的变量(先定义变量,后赋值) enum Week week; // 初始化 week = TUE; // 一定是这个枚举类型中定义的元素 printf("%d\n", week); // 3.定义枚举类型变量的同时赋值(定义变量和赋值同时进行) enum Week week1 = THU; printf("%d\n", week1); enum H { A, B, C // 多个元素使用逗号分隔 } x, y; x = B; y = C; printf("x=%d,y=%d\n", x, y); // 1,2 } void test2() { // 定义枚举 enum CaiQuan { SHI_TOU, JIAN_DAO, BU }; printf("请输入0~2之间的整数:\n[0-石头,1-剪刀,2-布]\n"); int number; scanf("%d", &number); switch (number) { case SHI_TOU: printf("石头\n"); break; case JIAN_DAO: printf("剪刀\n"); break; case BU: printf("布\n"); break; } } int main(int argc, char *argv[]) { test1(); test2(); return 0; }
typedef
说明:给类型重命名,不会影响到类型本身
作用:给已有的类型起别名
格式:
typedef 已有类型名 新别名;
使用:
// 方式1:先定义结构体类型,在重命名 // 定义一个结构体 struct Student { int id; char* name; char sex; int age; }; // 类型重命名 typedef struct Student Stu; // 定义结构体变量 struct Stu stu = {1,"张三",'w',21}; // 方式2:定义结构体的同时重命名 typedef struct PersonInfo { int a; double b; } Per; // 结构体类型的别名,本质上还是数据类型 // 定义变量 struct Per per = {2,5};
应用场景
- 数据类型复杂(结构体、共用体、枚举、结构体指针、无符号的长整型)时使用
- 为了跨平台兼容性,例如:
- size_t:类型重名后的数据类型:
typedef unsigned long size_t;
- unit_16:类型重命名后数据类型
- size_t:类型重名后的数据类型:
案例:
// 类型重命名 #include <stdio.h> struct Student { int age; char *name; double score; int arr[3]; }; typedef struct Student Stu_t; // 数据类型重命名 typedef Stu_t *pStu_t; // 结构体指针重命名 void test1() { Stu_t s1 = {23, "zhangsan", 23.33, {11, 22, 33}}; printf("%d, %s, %f, %d\n", s1.age, s1.name, s1.score, s1.arr[0]); // Stu_t *p = &s1; Stu_t *p; p = &s1; pStu_t p2; p2 = p; printf("%d, %s, %f, %d\n", p2->age, p2->name, p2->score, p2->arr[0]); } int main() { test1(); return 0; }