C语言:构造类型(补充)

发布于:2024-12-18 ⋅ 阅读:(104) ⋅ 点赞:(0)

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};
    
  • 应用场景

    • 数据类型复杂(结构体、共用体、枚举、结构体指针、无符号的长整型)时使用
    • 为了跨平台兼容性,例如:
      1. size_t:类型重名后的数据类型:typedef unsigned long size_t;
      2. unit_16:类型重命名后数据类型
  • 案例:

    // 类型重命名
    #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;
    }
    

网站公告

今日签到

点亮在社区的每一天
去签到