〃忝書γě渎ぐ 发表于 2020-7-10 09:15:32

int(*(*p)(int))();这个指针因该怎样拆解

CodingCat_k 发表于 2020-7-10 09:15:33

简化之后大概是下面这样:
typedefint(*pFunc)(void);//pFunc为一个函数指针(C/C++相关返回值里面只有函数指针),指向一个返回值为int,无参数的函数。。
pFunc(*p)(int);//p是一个函数指针,指向一个返回值为函数指针、参数是int类型的函数。

首先你需要找到变量,然后确定类型,本题中为一个指针(*p),然后看外面的括号发现右侧有一个(int)证明这是函数指针,
再向左侧找发现有一个*即所指向的函数的返回值类型也是指针,
最后看完了括号内的;再看下一层也是按运算符优先级找发现一对括号,即返回值指向一个函数(看起来像无参数,但是写法不规范,容易产生歧义)
再确定这个函数的返回值类型。

这类声明一般用上述的typedef重新分层之后会清晰很多,就比如常见的函数signal
声明:void(* signal(int sig,void(* func)(int)))(int);
如果直接看有些复杂,但是使用:typedefvoid(*pFunc)(int);之后
可简化成:pFuncsignal(int sig, pFunc);

赚小钱 发表于 2020-7-10 09:48:57

本帖最后由 赚小钱 于 2020-7-10 09:56 编辑

先上代码:

typedef int(*func_t1)(void);

typedef func_t1(*func_t2)(int);

typedef int (*(*p)(int))();

int print(void) {
    printf("hello world!\n");
}

func_t1 proxy(int a) {
    return &print;
}

void foo() {
    p target;
    target = proxy;
    target(1)();
}

int main() {
    foo();
}


分析方法:
这个还是很简单的,有中括号:就去定义数组类型,有小括号就去定义函数类型。
从两侧向中间解析。

结合上面的代码,自己分析一下吧。

lhgzbxhz 发表于 2020-7-10 09:57:11

本帖最后由 lhgzbxhz 于 2020-7-10 10:01 编辑

int(*(*p)(int)) 是一个函数指针,与int*(*p)(int)等价,指向参数为int,返回值为int*的一个函数
举个例子:#include <cstdio>
#include <Windows.h>

int* func1(int x)
{
        int* n = new int(x);
        return n; // 仅仅是用于测试
}

int main()
{
        int(*(*p)(int)) = func1;
        int* n = p(0);
        printf("%d\n", *n);
        delete n;
        system("pause");
        return 0;
}
还有,这么复杂的指针,平时几乎用不到,没必要学习、研究

〃忝書γě渎ぐ 发表于 2020-7-10 13:15:34

CodingCat_k 发表于 2020-7-10 09:15
简化之后大概是下面这样:
typedefint(*pFunc)(void);//pFunc为一个函数指针(C/C++相关返回值里面只 ...

大神,怎么推理呢,发现好多人会推理指针,我总被指针卡住,不知怎么学。

CodingCat_k 发表于 2020-7-10 14:38:15

〃忝書γě渎ぐ 发表于 2020-7-10 13:15
大神,怎么推理呢,发现好多人会推理指针,我总被指针卡住,不知怎么学。

链接:https://pan.baidu.com/s/1a3_4LS-yrmgT3CV5dBZW5Q
提取码:5j1k
复制这段内容后打开百度网盘
图片来源是《C专家编程》,相关书籍可以看看,对提升C大有帮助

〃忝書γě渎ぐ 发表于 2020-7-10 20:03:35

CodingCat_k 发表于 2020-7-10 14:38
链接:https://pan.baidu.com/s/1a3_4LS-yrmgT3CV5dBZW5Q
提取码:5j1k
复制这段内容后打开百度网盘
...

谢谢大神,原来如此。
页: [1]
查看完整版本: int(*(*p)(int))();这个指针因该怎样拆解