C 语言从 0 入门(二十一)|typedef 类型重定义:简化复杂类型,代码更清爽

大家好,我是网域小星球。

在前面的学习中,我们遇到了很多写起来又长又复杂的类型:比如结构体 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 的区别(面试常考))

九、综合示例(完整可运行)

十、高频易错点

十一、本章核心总结

下期预告

一、本章学习目标

  1. 理解 typedef 的作用:给类型起别名
  2. 掌握 typedef 基本用法:简化基本类型、数组
  3. typedef 简化结构体,告别 struct 前缀
  4. typedef 简化数组指针、指针数组
  5. typedef 简化函数指针,彻底告别复杂写法
  6. 理解 typedef#define 的区别

二、typedef 基本语法

cpp 复制代码
typedef 原有类型名 新类型名;

作用:给一个已有的数据类型,起一个别名,以后可以用新名字代替旧名字。

最简单示例:给 int 起别名

cpp 复制代码
typedef int myint;

myint a = 10;   // 等价于 int a = 10;

三、typedef 简化数组

cpp 复制代码
typedef int arr5[5];

含义:arr5int [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;
}

十、高频易错点

  1. typedef 当成变量定义,多加赋值
  2. 分不清 typedef#define,导致指针定义错误
  3. 函数指针别名写反顺序
  4. 结构体 typedef 末尾忘记分号
  5. 误用 typedef 定义变量,而非类型

十一、本章核心总结

  1. typedef = 给数据类型起别名,不创建新类型
  2. 简化结构体:告别 struct 关键字
  3. 简化复杂指针:数组指针、函数指针瞬间清爽
  4. 提高代码可读性、可维护性
  5. 是写项目、笔试、面试中非常高频的基础技能

下期预告

下一篇我们深入程序内存布局,搞懂变量到底存在哪里,彻底理解野指针、内存泄漏、生命周期等核心问题。

相关推荐
XWalnut2 小时前
LeetCode刷题 day10
数据结构·算法·leetcode
weixin_446023562 小时前
c语言第一个编译器是用什么语言写的?自举原理
c语言·编译器·迭代优化·无代码开发平台·自举原理
programhelp_2 小时前
Amazon OA 2026 高频题型拆解 + 速通攻略
数据结构·算法
脑神2 小时前
C/C++语言编译器
c语言
moonsea02032 小时前
2026.4.14
数据结构·算法·图论
x_xbx2 小时前
LeetCode:42. 接雨水
算法·leetcode·职场和发展
lixinnnn.3 小时前
01BFS:小明的游戏
算法
falldeep3 小时前
Claude Code源码分析
人工智能·算法·机器学习·强化学习
sheeta19983 小时前
LeetCode 每日一题笔记 日期:2026.04.14 题目:2463.最小移动距离
笔记·算法·leetcode