第 23 讲:typedef 关键字
前文我们讲完了所有三种自定义类型,也说明了它们的基本使用方式和模式,今天我们来看点不一样的。我们把这三种类型通过定义类型关键字 typedef
来改变它们的定义写法,甚至也可以用它把前文学到的所有类型都改个名字。
定义基本类型
我们可以使用 typedef
关键字,把一个基本类型换一个名字。这样的话,所有程序代码里将都可以使用这个替换的名称(当然也可以用原名)。
通过 typedef int Int32
这样的定义后,后面就可以使用 Int32
来替换 int
的定义方式了。
这种用法实际上也出现在很多场合,例如在 C 语言的文件里,经常将一个无符号的整数 unsigned int
定义为长度类型 size_t
,这种定义方式导致了我们一眼就看得出这是表示长度的参数,我们就不会传入一个负数数值,也不会传入一个小数。
定义指针变量类型
我们也可以拿这个定义关键字把指针类型改变类型名称。
这样的定义方式可以使得把 int *
改为 IntPtr
,后续就可以直接用这种定义符号来为指针类型作出定义了。不过需要注意的是,定义为指针类型后,后面的使用和没有定义的方式完全是一样的,只有定义语句的类型名称这里可以看到不同的地方。
定义数组变量类型
我们可以使用 typedef
为数组定义新的名称。写法和数组变量的声明差不多,只是这一次把数组变量改为了数组类型,写在对应位置上。
定义好后,数组类型就可以直接用了,把 IntArr
这种定义好的类型放在类型名称的位置上,类似于 int i
这样的定义默认,先类型后名称。然后后面的使用就和数组使用方式完全一样。
不过需要你注意的是,数组变量类型需要你为其赋准确的数组大小的数值。和前文一样,你不能定义 VLA 类型在这个 typedef
语句上。
定义数组指针类型
我们可以将复杂的类型改为很简单的类型,这也是 typedef
的一大功能。
试想一下,数组指针的写法是这样的:
这表示一个指向长度为 20 的一维数组的指针。这种写法很多时候都是很不好看和不好理解的,所以我们尝试将其定义为简单类型:
ptr
变量来指向 arr
*ptr
来获取指向的数组信息,然后再在后面添加索引器 []
写法完全类似于前文的方式,我们定义一个函数指针,然后让变量 ptr
直接指向函数即可。
函数传参也可以用哦!
而且,这样的使用可以到任意位置,包括前面的数组指针、数组变量、指针变量,也都可以用到函数传参的地方上来。例如:
typedef
定义后就可以直接这么书写了。当然,数组长度是可以不规定的,但 typedef
需要有这一个定义,所以我们不得不书写这个数字(当然,这个数字在这里显然是没啥用处的)。
结构体、联合体和枚举类型
经过这样的定义方式后,Week
、Student
和 Tag
三个单词就可以作为 enum week
、struct student
和 union tag
的替换类型名称了。你就不用再去书写前面的这个关键字 enum
、struct
和 union
了。
不过,这三个定义是把类型名称放后面的。
其它复杂类型的定义
还有一些复杂的类型,例如函数指针的数组,这些类型我们可以采用两次定义的方式来简化:
FuncPtr
这样也是可以的。