typedef关键字:类型重定义

当我们的一个类型不合适的时候,我们可以给他重新起个名。

用于简化代码。将一个复杂的已有的类型重新定义

一、书写格式:

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*。这种细节可能会在我们编程过程中带来一些问题。还是需要我们注意和重视。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值