鱼C论坛

 找回密码
 立即注册
查看: 990|回复: 6

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

[复制链接]
发表于 2020-7-10 09:15:32 | 显示全部楼层 |阅读模式
10鱼币
最佳答案
2020-7-10 09:15:33
简化之后大概是下面这样:
typedef  int  (*pFunc)(void);//pFunc为一个函数指针(C/C++相关返回值里面只有函数指针),指向一个返回值为int,无参数的函数。。
pFunc  (*p)(int);//p是一个函数指针,指向一个返回值为函数指针、参数是int类型的函数。

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

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

最佳答案

查看完整内容

简化之后大概是下面这样: typedef int (*pFunc)(void);//pFunc为一个函数指针(C/C++相关返回值里面只有函数指针),指向一个返回值为int,无参数的函数。。 pFunc (*p)(int);//p是一个函数指针,指向一个返回值为函数指针、参数是int类型的函数。 首先你需要找到变量,然后确定类型,本题中为一个指针(*p),然后看外面的括号发现右侧有一个(int)证明这是函数指针, 再向左侧找发现有一个*即所指向的函数的返回值类 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-10 09:15:33 | 显示全部楼层    本楼为最佳答案   
简化之后大概是下面这样:
typedef  int  (*pFunc)(void);//pFunc为一个函数指针(C/C++相关返回值里面只有函数指针),指向一个返回值为int,无参数的函数。。
pFunc  (*p)(int);//p是一个函数指针,指向一个返回值为函数指针、参数是int类型的函数。

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

这类声明一般用上述的typedef重新分层之后会清晰很多,就比如常见的函数signal
声明:void(* signal(int sig,void(* func)(int)))(int);
如果直接看有些复杂,但是使用:typedef  void  (*pFunc)(int);之后
可简化成:pFunc  signal(int sig, pFunc);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

结合上面的代码,自己分析一下吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
还有,这么复杂的指针,平时几乎用不到,没必要学习、研究
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-10 13:15:34 | 显示全部楼层
CodingCat_k 发表于 2020-7-10 09:15
简化之后大概是下面这样:
typedef  int  (*pFunc)(void);//pFunc为一个函数指针(C/C++相关返回值里面只 ...

大神,怎么推理呢,发现好多人会推理指针,我总被指针卡住,不知怎么学。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
〃忝書γě渎ぐ + 1 + 1 天呀,谢谢大神!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-10 20:03:35 | 显示全部楼层
CodingCat_k 发表于 2020-7-10 14:38
链接:https://pan.baidu.com/s/1a3_4LS-yrmgT3CV5dBZW5Q
提取码:5j1k
复制这段内容后打开百度网盘
...

谢谢大神,原来如此。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 15:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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