前言
C语言中typedef可以为一个数据类型定义别名(可以理解为人类的绰号),用来替代基本数据类型,数组类型,指针类型,自定义的结构体类型,枚举类型等等;这样使用可以让我们编码方便。下面我来看它在结构体中两个用法
定义基本类型和结构体
typedef int STDataType; typedef struct Stack { STDataType* a; int top; // 栈顶 int capacity; //容量 }ST;
正常定义一个结构体变量我们需要这样写:
struct Stack st1;
这样写每回要写struct感觉很麻烦,但不写又会报错,如果可以为 struct Stack 起一个别名ST(语法是在分号后面接起的新名字 如ST),这样写起来就方便了:
ST st1;
这样写好处是:写法更加简练,意义更加明确,工程实践中更会大量使用
同样的,我们可以使用关键字typedef 为各种数据类型起一个别名:
typedef int STDataType; // typedef oldname newname
typedef int STDataType; STDataType a,b; a = b =1;
这样做的好处是:我们在头文件
中为一个数据类型起一个别名,后续会很方便的修改变量类型
typedef不仅可以为结构体也可以为数组、指针等类型起别名:
数组
typedef char array10[10]; array10 a1,a2,a3; //等价于: char a1[10],a2[10],a3[10];
指针
typedef int* (*pfun)(int,char*); pfun a[5]; // 等价于 int * (*a[5]) (int ,char*);
与#define的区别:
#define 是宏定义,会在代码生成程序的预处理阶段进行宏替换(预处理功能主要包括宏定义,文件包含,条件编译,去注释等);
typedef 类似于将数据类型封装起来,能够保证定义的所有变量为同一类型
#define PTR_INT int * PTR_INT p1, p2;
宏替换后:
int *p1, p2;
这里 p1、p2 成为不同的类型:p1 是指向 int 类型的指针,p2 是 int 类型。
typedef int * PTR_INT PTR_INT p1, p2;
这里p1、p2 类型相同,它们都是指向 int 类型的指针。
本节完