LICHT 发表于 2018-1-31 12:26:29

s1e50 typedef的用法问题

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

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

像是typedef int *PRT
我就知道可以用他是定义一个整型指针

orino 发表于 2018-1-31 12:31:05

本帖最后由 orino 于 2018-1-31 12:33 编辑

这是定义了一个函数指针类型,形参为int,返回值为int*

orino 发表于 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去定义函数指针变量

BngThea 发表于 2018-1-31 12:38:57

同理可以推导PTR_TO_FUN就是一个函数指针,该函数需要一个int类型的参数,并返回一个int指针

LICHT 发表于 2018-1-31 13:17:28

orino 发表于 2018-1-31 12:38
判断这种类型定义是由方法的,例如typedef int *PRT, 先去掉typedef,就变成了 int *PRT,这里是定义了一个 ...

可是接下来就是PTR_TO_FUN array 了啊,这里是定义一个数组

LICHT 发表于 2018-1-31 13:19:28

BngThea 发表于 2018-1-31 12:38
同理可以推导PTR_TO_FUN就是一个函数指针,该函数需要一个int类型的参数,并返回一个int指针

可是接下来就是PTR_TO_FUN array 了啊,这里是定义一个数组

orino 发表于 2018-1-31 13:25:04

没错,是定义了一个数组,定义了一个3个元素的数组,数组每个元素的类型是函数指针,这样能理解嘛

BngThea 发表于 2018-1-31 13:29:45

LICHT 发表于 2018-1-31 13:19
可是接下来就是PTR_TO_FUN array 了啊,这里是定义一个数组

函数指针也可以作为数组成员

LICHT 发表于 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代表没形参吧

orino 发表于 2018-1-31 13:44:49

把完整的代码发过来看看,这样不好分析,void不是代表没有,只是代表空而已

LICHT 发表于 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);

人造人 发表于 2018-1-31 14:18:47

C语言复杂声明解析
http://blog.chinaunix.net/uid-29208421-id-5183647.html

LICHT 发表于 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呢

人造人 发表于 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);照样存在

人造人 发表于 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




请按任意键继续. . .
页: [1]
查看完整版本: s1e50 typedef的用法问题