鱼C论坛

 找回密码
 立即注册
查看: 1312|回复: 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)证明这是函数指针, 再向左侧找发现有一个*即所指向的函数的返回值类 ...
小甲鱼最新课程 -> https://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);
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-10 09:48:57 | 显示全部楼层
本帖最后由 赚小钱 于 2020-7-10 09:56 编辑

先上代码:

  1. typedef int(*func_t1)(void);

  2. typedef func_t1(*func_t2)(int);

  3. typedef int (*(*p)(int))();

  4. int print(void) {
  5.     printf("hello world!\n");
  6. }

  7. func_t1 proxy(int a) {
  8.     return &print;
  9. }

  10. void foo() {
  11.     p target;
  12.     target = proxy;
  13.     target(1)();
  14. }

  15. int main() {
  16.     foo();
  17. }
复制代码


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

结合上面的代码,自己分析一下吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-10 09:57:11 | 显示全部楼层
本帖最后由 lhgzbxhz 于 2020-7-10 10:01 编辑

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

  3. int* func1(int x)
  4. {
  5.         int* n = new int(x);
  6.         return n; // 仅仅是用于测试
  7. }

  8. int main()
  9. {
  10.         int(*(*p)(int)) = func1;
  11.         int* n = p(0);
  12.         printf("%d\n", *n);
  13.         delete n;
  14.         system("pause");
  15.         return 0;
  16. }
复制代码

还有,这么复杂的指针,平时几乎用不到,没必要学习、研究
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

大神,怎么推理呢,发现好多人会推理指针,我总被指针卡住,不知怎么学。
小甲鱼最新课程 -> https://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 天呀,谢谢大神!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

谢谢大神,原来如此。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 20:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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