鱼C论坛

 找回密码
 立即注册
查看: 1971|回复: 14

[已解决]s1e50 typedef的用法问题

[复制链接]
发表于 2018-1-31 12:26:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在复杂的声明里完全没理解typedef定义了个什么
  1. int *(*array[3])(int);

  2. typedef int *(*PTR_TO_FUN)(int);
  3. PTR_TO_FUN array[3];
复制代码

这里的PTR_TO_FUN代表的是什么?

像是
  1. typedef int *PRT
复制代码

我就知道可以用他是定义一个整型指针
最佳答案
2018-1-31 19:17:40
LICHT 发表于 2018-1-31 15:19
啊理解了理解了,typedef void (*PTR_TO_FUN)(void);是把PTR_TO_FUN定义为一个函数指针,这个指针指向一 ...

typedef void (*PTR_TO_FUN)(void);
PTR_TO_FUN funA(int,PTR_TO_FUN);

funA是一个函数,该函数有两个参数,第一个参数的类型是int,第二个参数的类型是PTR_TO_FUN,该函数有一个返回值,返回值的类型是PTR_TO_FUN

typedef void (*PTR_TO_FUN)(void); 不依赖 PTR_TO_FUN funA(int,PTR_TO_FUN); 没有 PTR_TO_FUN funA(int,PTR_TO_FUN);   ,typedef void (*PTR_TO_FUN)(void);照样存在
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-31 12:31:05 | 显示全部楼层
本帖最后由 orino 于 2018-1-31 12:33 编辑

这是定义了一个函数指针类型,形参为int,返回值为int*
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 12:38:49 | 显示全部楼层
判断这种类型定义是由方法的,例如typedef int *PRT, 先去掉typedef,就变成了 int *PRT,这里是定义了一个整数指针变量,变量名叫PRT, 但加上typedef, 就是将变量定义改成类型定义, 类型名为原先的变量名,例如typedef int *PRT就是定义了一个整数指针类型,可以继续用它去定义变量,如PRT prt;定义后的prt就是整数指针变量了。
同理函数指针定义
int *(*PTR_TO_FUN)(int);
这里是定义了一个名叫PTR_TO_FUN的函数指针变量, 形参为int类型, 返回值为int*类型
加上typedef int *(*PTR_TO_FUN)(int); 就改成了定义了一个名叫PTR_TO_FUN的函数指针类型, 形参为int类型, 返回值为int*类型
可以继续用PTR_TO_FUN去定义函数指针变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 12:38:57 | 显示全部楼层
同理可以推导PTR_TO_FUN就是一个函数指针,该函数需要一个int类型的参数,并返回一个int指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-31 13:17:28 | 显示全部楼层
orino 发表于 2018-1-31 12:38
判断这种类型定义是由方法的,例如typedef int *PRT, 先去掉typedef,就变成了 int *PRT,这里是定义了一个 ...

可是接下来就是PTR_TO_FUN array[3] 了啊,这里是定义一个数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-31 13:19:28 | 显示全部楼层
BngThea 发表于 2018-1-31 12:38
同理可以推导PTR_TO_FUN就是一个函数指针,该函数需要一个int类型的参数,并返回一个int指针

可是接下来就是PTR_TO_FUN array[3] 了啊,这里是定义一个数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 13:25:04 From FishC Mobile | 显示全部楼层
没错,是定义了一个数组,定义了一个3个元素的数组,数组每个元素的类型是函数指针,这样能理解嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 13:29:45 | 显示全部楼层
LICHT 发表于 2018-1-31 13:19
可是接下来就是PTR_TO_FUN array[3] 了啊,这里是定义一个数组

函数指针也可以作为数组成员
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-31 13:35:22 | 显示全部楼层
orino 发表于 2018-1-31 13:25
没错,是定义了一个数组,定义了一个3个元素的数组,数组每个元素的类型是函数指针,这样能理解嘛

那typedef void (*PTR_TO_FUN)(void)又怎么可以定义funA(int,PTR_TO_FUN)呢,funA不是有两个形参吗他写的是void代表没形参吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 13:44:49 | 显示全部楼层
把完整的代码发过来看看,这样不好分析,void不是代表没有,只是代表空而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-31 14:16:19 | 显示全部楼层
orino 发表于 2018-1-31 13:44
把完整的代码发过来看看,这样不好分析,void不是代表没有,只是代表空而已

就是简化声明,声明是void (*funA(int,void (*funB)(int)))(int);
然后
typedef void (*PTR_TO_FUN)(void);
PTR_TO_FUN funA(int,PTR_TO_FUN);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 14:18:47 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-31 15:19:39 | 显示全部楼层
人造人 发表于 2018-1-31 14:18
C语言复杂声明解析
http://blog.chinaunix.net/uid-29208421-id-5183647.html

啊理解了理解了,typedef void (*PTR_TO_FUN)(void);是把PTR_TO_FUN定义为一个函数指针,这个指针指向一个无形参无返回值的函数;PTR_TO_FUN funA(int,PTR_TO_FUN);的意思是funA自己有两个形参,一个是int,另一个是PTR_TO_FUN,返回值是一个函数指针,指向无形参无返回值的函数

但这样不是应该写成typedef void (*PTR_TO_FUN)(int);吗,为什么是写成void呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 19:17:40 | 显示全部楼层    本楼为最佳答案   
LICHT 发表于 2018-1-31 15:19
啊理解了理解了,typedef void (*PTR_TO_FUN)(void);是把PTR_TO_FUN定义为一个函数指针,这个指针指向一 ...

typedef void (*PTR_TO_FUN)(void);
PTR_TO_FUN funA(int,PTR_TO_FUN);

funA是一个函数,该函数有两个参数,第一个参数的类型是int,第二个参数的类型是PTR_TO_FUN,该函数有一个返回值,返回值的类型是PTR_TO_FUN

typedef void (*PTR_TO_FUN)(void); 不依赖 PTR_TO_FUN funA(int,PTR_TO_FUN); 没有 PTR_TO_FUN funA(int,PTR_TO_FUN);   ,typedef void (*PTR_TO_FUN)(void);照样存在
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 19:46:01 | 显示全部楼层
  1. #include <stdio.h>

  2. typedef void(*PTR_TO_FUN)(void);
  3. PTR_TO_FUN funA(int, PTR_TO_FUN);
  4. void (*funB(int, void (*pf)(void)))(void);
  5. void Test(void);

  6. int main(void)
  7. {
  8.         funA(3, Test);
  9.         printf("\n");
  10.         funB(3, Test);
  11.        
  12.         printf("\n");
  13.         funA(2, Test)();
  14.         printf("\n");
  15.         funB(2, Test)();

  16.         printf("\n");
  17.         funA(0, Test);
  18.         printf("\n");
  19.         funB(0, Test);

  20.         printf("\n");
  21.         funA(-1, Test);
  22.         printf("\n");
  23.         funB(-1, Test);

  24.         return 0;
  25. }

  26. PTR_TO_FUN funA(int n, PTR_TO_FUN pf)
  27. {
  28.         if(n < 0)        // 只是一个测试,不然最后只返回pf没有意义,这样还算有点意义^_^
  29.                 return NULL;

  30.         while(n--)
  31.         {
  32.                 pf();
  33.         }

  34.         return pf;
  35. }

  36. void(*funB(int n, void(*pf)(void)))(void)
  37. {
  38.         if(n < 0)        // 只是一个测试,不然最后只返回pf没有意义,这样还算有点意义^_^
  39.                 return NULL;

  40.         while(n--)
  41.         {
  42.                 pf();
  43.         }

  44.         return pf;
  45. }

  46. void Test(void)
  47. {
  48.         printf("Test\n");
  49. }
复制代码

  1. Test
  2. Test
  3. Test

  4. Test
  5. Test
  6. Test

  7. Test
  8. Test
  9. Test

  10. Test
  11. Test
  12. Test




  13. 请按任意键继续. . .
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 17:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表