鱼C论坛

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

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

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

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

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

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

typedef int *(*PTR_TO_FUN)(int);
PTR_TO_FUN array[3];
这里的PTR_TO_FUN代表的是什么?

像是
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 | 显示全部楼层
#include <stdio.h>

typedef void(*PTR_TO_FUN)(void);
PTR_TO_FUN funA(int, PTR_TO_FUN);
void (*funB(int, void (*pf)(void)))(void);
void Test(void);

int main(void)
{
        funA(3, Test);
        printf("\n");
        funB(3, Test);
        
        printf("\n");
        funA(2, Test)();
        printf("\n");
        funB(2, Test)();

        printf("\n");
        funA(0, Test);
        printf("\n");
        funB(0, Test);

        printf("\n");
        funA(-1, Test);
        printf("\n");
        funB(-1, Test);

        return 0;
}

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

        while(n--)
        {
                pf();
        }

        return pf;
}

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

        while(n--)
        {
                pf();
        }

        return pf;
}

void Test(void)
{
        printf("Test\n");
}
Test
Test
Test

Test
Test
Test

Test
Test
Test

Test
Test
Test




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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-29 07:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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