typedef struct 是 C 语言里面非常常用的组合写法,作用就是给结构体 struct 自定义一个别名,以后写代码的时候不用每次都重复写 struct 关键字,简化结构体变量的声明,原本标准结构体写法,每次定义变量都必须带上 struct,如果加上 typedef,就相当于给这个结构体类型起一个简短新名字,后续声明变量直接使用这个别名就可以,这个语法在单片机 嵌入式 驱动开发 项目源码里面大量出现,很多初学 C 语言的同学容易混淆 typedef 的作用,误以为 typedef 是创建新变量,其实 typedef 本质是类型重命名,它不会开辟内存,只是给原有数据类型增加一个别名,理解 typedef struct 用法,要掌握基础书写格式,两种常见书写形式,内存存储特点,和普通 struct 写法对比,还有指针 数组 嵌套结构体搭配写法,同时要区分容易踩坑的点,比如别名位置,匿名结构体配合 typedef,以及 C 语言和 C++ 里面这个写法的差异,C++ 本身 struct 可以省略 struct 关键字,但是 C 语言必须依靠 typedef 来简化书写。
核心信息对照表
| 项目 | 内容 |
|---|---|
| 语法名称 | typedef struct |
| 所属语言 | C 语言 |
| 核心作用 | 给结构体类型定义别名 |
| 是否开辟内存 | 不会开辟内存,仅类型重命名 |
| 主要优势 | 简化代码,减少 struct 关键字重复书写 |
| 常见应用 | 嵌入式 单片机 项目源码 |
基础书写两种形式
第一种 带标签的写法
typedef struct Student
{
int id;
char name [20];
int age;
} Student;
这里 struct 后面的 Student 是结构体标签,末尾的 Student 就是 typedef 生成的别名,后面声明变量直接写 Student s1,不需要写 struct Student s1。
第二种 匿名结构体写法
typedef struct
{
int id;
char name [20];
int age;
} Student;
这种写法没有结构体标签,只能依靠 typedef 末尾的别名来使用这个结构体类型,不能单独使用 struct 来声明变量,适合只需要这一种结构体类型,不需要标签复用的场景。
详细使用步骤
第一步 写出关键字 typedef,紧接着写 struct,开启结构体定义
第二步 在大括号内部定义结构体成员,也就是这个类型里面包含哪些变量
第三步 在大括号结束之后,写上自定义的别名,这个就是后续代码使用的新类型名
第四步 声明变量的时候,直接使用这个别名,就像使用 int char 这类基础类型一样
第五步 如果需要定义结构体指针,就写成 Student p,这里 p 是指向该结构体类型的指针
和原始 struct 写法对比
| 写法 | 声明变量格式 | 是否需要 struct 关键字 |
|---|---|---|
| 普通 struct | struct Student s1 | 每次声明都要写 struct |
| typedef struct | Student s1 | 不需要写 struct |
进阶搭配知识点
1 结构体数组,使用别名之后可以直接定义数组 Student stu [10],代表十个该结构体元素组成的数组
2 嵌套结构体,typedef struct 里面的成员还可以是另外一个已经 typedef 好的结构体别名
3 函数传参,函数形参可以直接使用这个别名,比如 void func (Student data),让函数代码更简洁
4 注意区分,typedef 只是别名,不是全新独立类型,别名和原来的 struct 类型本质是同一个类型,可以互相赋值
常见踩坑清单
1 把 typedef 当成创建变量,误以为大括号里面定义的成员会自动分配内存,typedef 只做类型定义,不创建实例
2 别名写错位置,把别名写在 struct 标签后面,不是大括号末尾,编译报错
3 匿名结构体继续尝试写 struct Student,因为没有标签,会直接编译失败
4 C++ 环境虽然支持 typedef struct,但是 C++ 原生 struct 本身就可以省略 struct,这个写法更多是兼容跨 C 和 C++ 代码
基础示例代码
typedef struct
{
int num;
float score;
} Stu;
int main()
{
Stu a;
a.num = 1;
a.score = 90.5;
return 0;
}
【常见问题】
问题 1 typedefstruct 用法,typedef 会不会生成新的数据类型
回答 1 typedefstruct 用法里面的 typedef 不会创造全新类型,只是给原有结构体类型增加别名,底层类型还是原来的 struct 结构体,本质不变。
问题 2 typedefstruct 用法,匿名结构体可以使用吗
回答 2 typedefstruct 用法支持匿名结构体,也就是 struct 后面不写标签,只依靠大括号末尾的别名来使用这个类型,这种写法非常普遍。
问题 3 typedefstruct 用法,C 语言不加 typedef 可以吗
回答 3 typedefstruct 用法是可选优化写法,不加 typedef 当然可以,只是每次声明结构体变量都必须带上 struct 关键字,代码会更冗长。
【免责申明】
本文关于 typedefstruct 用法属于标准 C 语言基础语法讲解,不同编译器对于扩展语法支持存在差异,内容仅作为编程学习参考,部分 C 标准新版本特性不在本文覆盖范围,实际编译请以对应编译器规范为准。


