news 2026/5/12 11:31:09

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C 语言从 0 入门(二十一)|typedef 类型重定义:简化复杂类型,代码更清爽

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

在前面的学习中,我们遇到了很多写起来又长又复杂的类型:比如结构体struct Student、数组指针int (*p)[5]、函数指针int (*fp)(int,int)。每次都完整写一遍非常麻烦,还容易写错。

C 语言提供了typedef关键字,专门用来给数据类型起别名,让复杂类型变简单、代码更整洁易读。本篇从基础用法到进阶场景,结合结构体、指针、函数指针一起讲,全程 VS2022 可直接运行。

目录

一、本章学习目标

二、typedef 基本语法

最简单示例:给 int 起别名

三、typedef 简化数组

四、typedef 简化结构体(最常用)

五、typedef 简化指针

六、typedef 简化数组指针

七、typedef 简化函数指针(超级实用)

八、typedef 与 #define 的区别(面试常考)

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

十、高频易错点

十一、本章核心总结

下期预告

一、本章学习目标

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

二、typedef 基本语法

typedef 原有类型名 新类型名;

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

最简单示例:给 int 起别名

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

三、typedef 简化数组

typedef int arr5[5];

含义:arr5int [5]这种数组类型的别名。

使用:

arr5 nums = {1,2,3,4,5}; // 等价于 int nums[5];

四、typedef 简化结构体(最常用)

以前写结构体:

struct Student { int id; char name[20]; }; struct Student stu;

typedef简化后:

typedef struct Student { int id; char name[20]; } Stu; Stu stu; // 不用再写 struct

更简洁写法:

typedef struct { int id; char name[20]; } Stu;

以后直接用Stu代替struct Student,清爽很多。


五、typedef 简化指针

typedef int* intP;

使用:

int a = 10; intP p = &a; // 等价于 int *p = &a;

六、typedef 简化数组指针

数组指针写法:

int (*p)[5];

typedef简化:

typedef int (*ArrP)[5];

使用:

int arr[2][5]; ArrP p = arr;

瞬间不再眼花。


七、typedef 简化函数指针(超级实用)

函数指针原写法:

int (*fp)(int, int);

typedef简化:

typedef int (*FuncP)(int, int);

以后直接用:

FuncP fp = add;

完整示例:

#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只是简单文本替换,预编译阶段处理

例子:

typedef int* intP; intP a, b; // a、b 都是 int*
#define intP int* intP a, b; // 展开为 int* a, b; // a 是 int*,b 是 int

这是经典坑点。


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

#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. 是写项目、笔试、面试中非常高频的基础技能

下期预告

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 11:28:47

千病智能体:从病种深耕到医疗普惠的范式创新与规模化实践

在 2026 年智慧医疗全面落地的新阶段&#xff0c;医疗 AI 正经历从 “广而浅” 到 “专而深” 的战略转向。作为这一趋势的引领者&#xff0c;悦尔千病智能体凭借其覆盖 1000 疾病的防、筛、诊、治、康、养全周期管理能力&#xff0c;正在重新定义人工智能在医疗健康领域的价值…

作者头像 李华
网站建设 2026/5/12 11:30:47

Claude Code 国产模型配置详解 混元豆包千问智谱 Kimi 实操

纯个人实操分享&#xff0c;无任何商业推广&#xff0c;所有步骤均为本人亲测可落地&#xff0c;整理出来给同样有需求的朋友避坑。 最近身边很多用 Claude Code 写代码、做开发的朋友&#xff0c;都在问怎么接入国产大模型。要么是做国内业务需要合规的数据处理&#xff0c;要…

作者头像 李华
网站建设 2026/4/14 22:38:38

从零搭建LuckFox RK3576嵌入式开发环境:一站式工具链配置指南

1. 开发环境搭建前的准备工作 第一次接触LuckFox RK3576开发板时&#xff0c;最让人头疼的就是开发环境的搭建。作为一个过来人&#xff0c;我深知新手在这个阶段容易踩的坑。下面我就把整个环境搭建的过程掰开揉碎&#xff0c;用最直白的语言讲清楚。 开发环境主要分为三大部分…

作者头像 李华
网站建设 2026/4/14 22:38:31

【应用层-FTP文件传输协议】

应用层-FTP文件传输协议一、概念二、其他要点1、工作模式2、登录方式一、概念 1.在两台电脑之间&#xff0c;专门用来传文件的一套标准规则。 2.把文件从电脑 A → 传到 电脑 B / 服务器&#xff1b;下载服务器上的文件&#xff1b;管理服务器里的文件&#xff08;新建、删除、…

作者头像 李华
网站建设 2026/4/14 22:35:47

如何用参数解构在函数入口处直接提取对象属性

完全行&#xff0c;是现代 JavaScript 最自然的写法之一&#xff1b;但需权衡是否保留原始对象、处理缺失属性及默认值需求&#xff0c;且要注意 null/undefined 和类型校验等边界情况。函数参数里直接解构对象属性&#xff0c;行不行&#xff1f;完全行&#xff0c;而且是现代…

作者头像 李华