当我们的一个类型不合适的时候,我们可以给他重新起个名。
用于简化代码。将一个复杂的已有的类型重新定义
一、书写格式:
1、先写typedef
2、想改名的类型,如unsighed int无符号整型数组
3、重命名的名字
例:typedef unsighed int u_int;
此后unsighed int a=u_int a
例:typedef int* pint_t,将int*改名改成pint_t
数组指针和函数指针的重定义方式相似且十分特殊,单独拎出来记忆。
如:数组指针int (*p) [5],这个是数组指针,类型为去掉函数名剩余部分(int(*)[5]),这里我们重定义的名字就不是放在改名类型后面,而是放在括号里面——>typedef int(*pf_t)[5],这里pf_t就是我们重定义的名字。pf_t就是int (*)[5]
同理函数指针也一样,typedef int(* p2)(int),重命名p2类型为函数指针,typedef int (*)(int)。
二、灵活运用
这个例子比较特殊,专门拿来给我们理解重定义typedef的。
来我们一步一步分析。sigal(int, void(*)(int),这是个啥格式?函数。函数名是signal,参数是int和void(*)(int)。这个void(*)(int)就是我们上篇博客里说的函数指针,返回类型是void,也就是没有返回类型,参数是整型。由我们的函数书写格式可知,函数名前面的就是函数的返回类型,我们看这个它返回类型是个*。其实应该整个来看void(*——)(int),没错,这个就是它的返回类型,返回类型也是一个函数指针,返回一个函数给你,这个函数呢没有返回类型,参数为整型。到此我们就能理解这个代码。一个函数的返回类型是函数指针,这个函数的参数中包含了一个函数指针。你看是不是有很多个函数指针在一个表达式里面。这不仅不方便我们阅读,而且给我们理解还上了强度。所以我们灵活利用typedef重定义,给它重新起一个名字。如:typedef int(*pang)(int);
然后我们的代码就可以变成pang signal(int ,pang)
代码是一样的。这就是灵活应用我们的typedef。
三、补充拓展
关于typedef和#define之间的差别。它们好像都有着类似的功能,一个是重命名,一个是定义。但是呢还是有一点小小差别的。
举个例子,typedef int* ptr_t;这是将int*这歌类型重命名为ptr_t。而#define PTR_T int*,作用是定义一个符号叫PTR_T,它里面的内容是int*。
ptr_t p1 , p2;和PTR_T p3, p4;这两种代码是不一样的。产生的结果是不同的。
这里p1,p2都是指针变量。但是p3,p4不一样。p3是指针变量,p4是整型变量。如何理解呢?
ptr_t是一个类型,就是整型指针,所以p1,p2都是一样类型。但是我们的#define不是的,它在我们的编译器里相当于直接复制粘贴。#define PTR_T int*,在我们编译器中相当于PTR_T=int*。它在编译器里产生的结果就是PTR_T p3, p4= int*p3, p4。这就产生了差异,*给p3用了,导致p3是指针变量,但是p4就是整型变量。typedef int* ptr_t,这是正儿八经的重定义类型,PTR_T这个是个符号而已内容会变,替换成后面的int*。这种细节可能会在我们编程过程中带来一些问题。还是需要我们注意和重视。