欢迎光临散文网 会员登陆 & 注册

第 23 讲:typedef 关键字

2021-10-04 03:24 作者:SunnieShine  | 我要投稿

前文我们讲完了所有三种自定义类型,也说明了它们的基本使用方式和模式,今天我们来看点不一样的。我们把这三种类型通过定义类型关键字 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 需要有这一个定义,所以我们不得不书写这个数字(当然,这个数字在这里显然是没啥用处的)。


结构体、联合体和枚举类型

经过这样的定义方式后,WeekStudentTag 三个单词就可以作为 enum weekstruct studentunion tag 的替换类型名称了。你就不用再去书写前面的这个关键字 enumstructunion 了。

不过,这三个定义是把类型名称放后面的。


其它复杂类型的定义

还有一些复杂的类型,例如函数指针的数组,这些类型我们可以采用两次定义的方式来简化:

第一句定义了一个函数指针类型 FuncPtr 类型,第二句则直接类似于前面定义数组的方式,把数组元素类型放在开头,数组声明长度的中括号放在末尾,然后中间写定义的类型,这样就可以分步定义了。逻辑也不至于很复杂。你也可以一步搞定:

这样也是可以的。

第 23 讲:typedef 关键字的评论 (共 条)

分享到微博请遵守国家法律