Skip to content

11 、结构体


一、枚举(enum)🧀

1、常量符号化🧀

enum colors { red, yellow, green };

枚举是一种用户定义的数据类型,用关键字 enum 声明:

enum 枚举类型名 { 名字0, , 名字n };
enum color { red, yellow, green };

void f(enum color c);

int main(void) {
    enum color t = red;
    scanf("%d", &t);
    f(t);
    return 0;
}

void f(enum color c) {
    printf("%d\n", c);
}
  • 枚举量可以作为使用。
  • 枚举类型可以用 enum 声明。
  • 实际上内部以整数存储与计算。

2、自动计数的枚举🧀

enum COLOR { RED, YELLOW, GREEN, NumCOLORS };

这样在需要遍历所有枚举值或用枚举量作数组下标时会更方便。

3、枚举量的赋值🧀

可以为枚举量指定具体值

enum COLOR { RED = 1, YELLOW, GREEN = 5 };

后续未指定的成员自动递增。

Info

  • 枚举比 const int 更简洁;
  • 枚举比宏(#define)更安全,因为它具有类型检查特性。

二、结构(struct)🧀

1、结构类型声明🧀

1
2
3
4
5
struct date {
    int month;
    int day;
    int year;
}; // 注意分号

Tip

通常在函数外部声明结构类型,以便多个函数共用。

struct date {
    int year;
    int month;
    int day;
};

int main(void) {
    struct date today;
    today.day = 10;
    today.month = 12;
    today.year = 2001;

    printf("Today's date is %i-%i-%i.\n", today.year, today.month, today.day);
    return 0;
}

2、声明结构的三种形式🧀

(1) 声明结构类型与变量分开:

1
2
3
4
5
6
struct point {
    int x;
    int y;
};

struct point p1, p2;

(2) 无名结构:

1
2
3
4
struct {
    int x;
    int y;
} p1, p2;

(3) 声明类型并同时定义变量:

1
2
3
4
struct point {
    int x;
    int y;
} p1, p2;

Note

①与③都定义了结构类型 point, ②仅定义了结构变量,无类型名。

3、结构初始化🧀

1
2
3
struct date today = {7, 31, 2024};
struct date today2 = { .month = 7, .year = 2024 };
// 未赋值成员自动初始化为 0

4、结构成员访问🧀

  • 数组成员[] 访问 e.g. a[0] = 10;
  • 结构成员. 访问 e.g. today.day = 31;

5、结构的运算🧀

结构之间可以直接整体赋值,而数组不行:

p1 = (struct point){5, 10}; // 初始化
p1 = p2;                    // 整体复制

6、结构指针🧀

结构变量名不是地址,必须显式取地址:

struct date today;
struct date *pDate = &today;

三、结构与函数🧀

1、结构作为参数传递🧀

int numberOfDays(struct date d);

结构作为参数时,会在函数内复制一份完整结构

2、结构输入🧀

scanf 不能直接一次性输入整个结构, 通常通过临时结构变量输入,再整体返回。

3、结构指针作为参数🧀

1
2
3
4
5
struct date myday;
struct date *p = &myday;

(*p).month = 12; // 等价于:
p->month = 12;

-> 用于访问指针指向的结构体成员