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;
}