跳到主要内容

06 结构体 枚举

不同类型的数据放一起

1. 结构体​

图片
struct person {
char* name;
int age;
};
  • struct person 是定义的结构体类型;

  • name 和 age 是它的成员,分别保存姓名的地址和年龄;

接着创建结构体变量,并用点号访问成员:

struct person student = {"Xiao Ming", 18};

printf("%s: %d\n", student.name, student.age);

初值按成员顺序填写,所以姓名是 Xiao Ming,年龄是 18。

  • char* name 是字符指针,保存字符串首字符的地址;
  • int age 直接保存整数。
提示

实例化后结构体变量的名字就是第一个成员的地址。

2. typedef类型别名​

每次写 struct person 有些长,可以给它起一个简洁一点的别名person_TypeDef

typedef struct person person_TypeDef;

person_TypeDef 是结构体类型的别名,也可以把结构体定义和别名合在一起写:

typedef struct {
char* name;
int age;
} person_TypeDef;

//等价于
struct person {
char* name;
int age;
};
typedef struct person person_TypeDef;
提示

typedef 给类型起别名,不会实例化变量。STM32 中的 GPIO_InitTypeDef、ADC_HandleTypeDef 也是这样的类型名。

4. 结构体指针​

图片
person_TypeDef *p = &student;

指针p 保存 student 的地址,就可以通过指针操作结构体。

person_TypeDef *p = &student;
p->age = 10;

person_TypeDef student;
student.age = 10;
  • 通过结构体变量操作成员,用 .;
  • 通过结构体指针变量操作成员,用 ->。
void update_age(person_TypeDef *p, int age)//结构体传参等价于:person_TypeDef *p = &student;
{
p->age = age;
}
结构体传参

STM32 中的 hadc->Instance 也是一样:hadc 是结构体指针,Instance 是它指向的结构体成员。

3. enum枚举​

以STM32 中用枚举给 GPIO 的低电平和高电平起名字为例子

typedef enum {
GPIO_PIN_RESET = 0u,
GPIO_PIN_SET
} GPIO_PinState;

// 等价于
enum GPIO_State {
GPIO_PIN_RESET = 0u,
GPIO_PIN_SET
};
typedef enum GPIO_State GPIO_PinState;
  • GPIO_PIN_RESET 表示 0(低电平),0u 中的 u 表示无符号整数;

  • GPIO_PIN_SET 没有填写数值,后面的都按顺序来;

  • 如果第一个成员也不填写数值,默认从 0 开始;

练习

用结构体保存姓名和年龄

右侧已准备好 person 结构体。定义一个 student 变量,用点号给 name 赋值 "Xiao Ming"、age 赋值 18,再输出这两个成员。

示例输出

Xiao Ming: 18
提示

变量写成 struct person student;,通过 student.name 和 student.age 访问成员。姓名用 %s,年龄用 %d 输出。

参考代码
main.c
#include <stdio.h>

struct person {
char* name;
int age;
};

int main(void)
{
struct person student;
student.name = "Xiao Ming";
student.age = 18;
printf("%s: %d\n", student.name, student.age);
return 0;
}
代码
正在准备编辑器…
运行结果