大家好,我是网域小星球。
在前面的学习中,我们遇到了很多写起来又长又复杂的类型:比如结构体 struct Student、数组指针 int (*p)[5]、函数指针 int (*fp)(int,int)。每次都完整写一遍非常麻烦,还容易写错。
C 语言提供了 typedef 关键字,专门用来给数据类型起别名,让复杂类型变简单、代码更整洁易读。本篇从基础用法到进阶场景,结合结构体、指针、函数指针一起讲,全程 VS2022 可直接运行。
目录
[二、typedef 基本语法](#二、typedef 基本语法)
[最简单示例:给 int 起别名](#最简单示例:给 int 起别名)
[三、typedef 简化数组](#三、typedef 简化数组)
[四、typedef 简化结构体(最常用)](#四、typedef 简化结构体(最常用))
[五、typedef 简化指针](#五、typedef 简化指针)
[六、typedef 简化数组指针](#六、typedef 简化数组指针)
[七、typedef 简化函数指针(超级实用)](#七、typedef 简化函数指针(超级实用))
[八、typedef 与 #define 的区别(面试常考)](#define 的区别(面试常考))
一、本章学习目标
- 理解
typedef的作用:给类型起别名 - 掌握
typedef基本用法:简化基本类型、数组 - 用
typedef简化结构体,告别struct前缀 - 用
typedef简化数组指针、指针数组 - 用
typedef简化函数指针,彻底告别复杂写法 - 理解
typedef与#define的区别
二、typedef 基本语法
cpp
typedef 原有类型名 新类型名;
作用:给一个已有的数据类型,起一个别名,以后可以用新名字代替旧名字。
最简单示例:给 int 起别名
cpp
typedef int myint;
myint a = 10; // 等价于 int a = 10;
三、typedef 简化数组
cpp
typedef int arr5[5];
含义:arr5 是 int [5] 这种数组类型的别名。
使用:
cpp
arr5 nums = {1,2,3,4,5};
// 等价于 int nums[5];
四、typedef 简化结构体(最常用)
以前写结构体:
cpp
struct Student
{
int id;
char name[20];
};
struct Student stu;
用 typedef 简化后:
cpp
typedef struct Student
{
int id;
char name[20];
} Stu;
Stu stu; // 不用再写 struct
更简洁写法:
cpp
typedef struct
{
int id;
char name[20];
} Stu;
以后直接用 Stu 代替 struct Student,清爽很多。
五、typedef 简化指针
cpp
typedef int* intP;
使用:
cpp
int a = 10;
intP p = &a;
// 等价于 int *p = &a;
六、typedef 简化数组指针
数组指针写法:
cpp
int (*p)[5];
用 typedef 简化:
cpp
typedef int (*ArrP)[5];
使用:
cpp
int arr[2][5];
ArrP p = arr;
瞬间不再眼花。
七、typedef 简化函数指针(超级实用)
函数指针原写法:
cpp
int (*fp)(int, int);
用 typedef 简化:
cpp
typedef int (*FuncP)(int, int);
以后直接用:
cpp
FuncP fp = add;
完整示例:
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
typedef int (*FuncP)(int, int);
int add(int a, int b)
{
return a + b;
}
int main()
{
FuncP fp = add;
printf("%d\n", fp(10, 20));
return 0;
}
菜单项目里用这个,代码会干净一大截。
八、typedef 与 #define 的区别(面试常考)
typedef是给类型起别名,是编译器真正识别的类型#define只是简单文本替换,预编译阶段处理
例子:
cpp
typedef int* intP;
intP a, b;
// a、b 都是 int*
cpp
#define intP int*
intP a, b;
// 展开为 int* a, b;
// a 是 int*,b 是 int
这是经典坑点。
九、综合示例(完整可运行)
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
// 结构体重定义
typedef struct
{
int id;
char name[20];
} Stu;
// 函数指针重定义
typedef void (*ShowFunc)(Stu);
void show(Stu s)
{
printf("%d %s\n", s.id, s.name);
}
int main()
{
Stu s = {1001, "张三"};
ShowFunc fp = show;
fp(s);
return 0;
}
十、高频易错点
- 把
typedef当成变量定义,多加赋值 - 分不清
typedef和#define,导致指针定义错误 - 函数指针别名写反顺序
- 结构体
typedef末尾忘记分号 - 误用
typedef定义变量,而非类型
十一、本章核心总结
typedef= 给数据类型起别名,不创建新类型- 简化结构体:告别
struct关键字 - 简化复杂指针:数组指针、函数指针瞬间清爽
- 提高代码可读性、可维护性
- 是写项目、笔试、面试中非常高频的基础技能
下期预告
下一篇我们深入程序内存布局,搞懂变量到底存在哪里,彻底理解野指针、内存泄漏、生命周期等核心问题。