鱼C论坛

 找回密码
 立即注册
查看: 1675|回复: 16

[已解决]函数指针

[复制链接]
发表于 2021-10-25 11:16:53 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 我是第一名 于 2021-10-25 11:19 编辑

有这么一个代码:
void ( * signal ( int , void ( * ) ( int ) ) )( int )

能否解释一下是什么意思?

signal 是一个函数名
最佳答案
2021-10-25 13:43:42
本帖最后由 番杰 于 2021-10-26 10:40 编辑

拆看,一部分一部分的看:
(1)
  1. signal ( int , void ( * ) ( int ) )
复制代码

signal是一个函数:

(2)该函数有两个参数:
  1. int , void ( * ) ( int )
复制代码

第一个参数:int类型
第二个参数:是一个函数指针,它指向的是一个   “参数为int,无返回值的函数”

(3)忽略上方已进行分析的:
  1. void (* signal ( 参数 ) )( int )
复制代码

摘出 signal ( 参数 )  ,剩下的都可以看成signal(参数)这个函数的返回值类型:
即:void (*) (int),这个就跟signal函数中的第二个参数一样:
是一个函数指针,它指向的是一个   “参数为int,无返回值的函数”

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

使用道具 举报

发表于 2021-10-25 11:27:48 | 显示全部楼层
  1. void (*signal(int, void (*)(int)))(int)

  2. 多了一层括号,看着不习惯,去掉
  3. void *signal(int, void (*)(int))(int)

  4. signal 是一个函数,有两个参数,一个返回值
  5. 第 0 个参数是 int 类型
  6. 第 1 个参数是一个指针,指向函数的指针,函数有一个 int 类型的参数,没有返回值
  7. 返回值是一个指针,指向函数的指针,指向的这个函数有一个 int 类型的参数,没有返回值
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-25 11:51:06 | 显示全部楼层

大佬你去掉括号那最后一个 ( int )不就先和signal的返回值先结合了?
还有就是我怎么去确定signal的返回类型?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-25 12:33:43 | 显示全部楼层
https://blog.csdn.net/tonglin12138/article/details/93657393
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-25 12:36:13 | 显示全部楼层
我是第一名 发表于 2021-10-25 11:51
大佬你去掉括号那最后一个 ( int )不就先和signal的返回值先结合了?
还有就是我怎么去确定signal的返回 ...

?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-25 12:56:25 | 显示全部楼层
我是第一名 发表于 2021-10-25 11:51
大佬你去掉括号那最后一个 ( int )不就先和signal的返回值先结合了?
还有就是我怎么去确定signal的返回 ...

那加了括号呢?
加了括号不也是 最后一个 ( int )和signal的返回值先结合 ?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-25 12:56:31 | 显示全部楼层

就是你去掉括号来看改变了原来的运算顺序
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-25 13:12:35 | 显示全部楼层
人造人 发表于 2021-10-25 12:56
那加了括号呢?
加了括号不也是 最后一个 ( int )和signal的返回值先结合 ?

加了括号就是
void (* 返回值 ) ( int )
先和 * 结合了  整体看是一个函数指针

你不要括号就是
void *返回值 ( int )
返回值和 ( int )先结合 显然不是个函数指针。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-25 13:23:25 | 显示全部楼层
我是第一名 发表于 2021-10-25 13:12
加了括号就是
void (* 返回值 ) ( int )
先和 * 结合了  整体看是一个函数指针

事实是不会这样
(int) 是一个函数
返回值和函数先结合是什么意思?一个函数返回一个函数?不
不加括号也是先看左边的 *,* 表示是一个指针,然后再看右边,右边是 (int)
说明这个返回的指针指向一个函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-25 13:27:37 | 显示全部楼层
我是第一名 发表于 2021-10-25 13:12
加了括号就是
void (* 返回值 ) ( int )
先和 * 结合了  整体看是一个函数指针

void *返回值 ( int )

你指的是这样吗?
void *(返回值 ( int ))

你可以用编译器编译一下这样的代码,会报错的,语法错误

  1. main.c:4:8: error: ‘signal’ declared as function returning a function
  2. void *(signal(int, void (*)(int))(int));
  3.         ^~~~~~
复制代码


看英文的错误提示,一个函数返回了一个函数

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

使用道具 举报

发表于 2021-10-25 13:43:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 番杰 于 2021-10-26 10:40 编辑

拆看,一部分一部分的看:
(1)
  1. signal ( int , void ( * ) ( int ) )
复制代码

signal是一个函数:

(2)该函数有两个参数:
  1. int , void ( * ) ( int )
复制代码

第一个参数:int类型
第二个参数:是一个函数指针,它指向的是一个   “参数为int,无返回值的函数”

(3)忽略上方已进行分析的:
  1. void (* signal ( 参数 ) )( int )
复制代码

摘出 signal ( 参数 )  ,剩下的都可以看成signal(参数)这个函数的返回值类型:
即:void (*) (int),这个就跟signal函数中的第二个参数一样:
是一个函数指针,它指向的是一个   “参数为int,无返回值的函数”

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

使用道具 举报

发表于 2021-10-25 14:00:59 | 显示全部楼层
这题目太深,不是很理解,void (*) (int) 里面需要的参数从哪里来?
以下是我所理解的,但是不带参数 int y
  1. #include <stdio.h>

  2. void (*funcA(int x, void *funcB(int y)))(int){
  3.     printf("我是函数 funcA,x 是 %d\n", x);
  4.     funcB(x);
  5. }

  6. void funcC(int x){
  7.     printf("我是函数 funcC,x 是 %d\n", x);
  8. }

  9. int main()
  10. {
  11.     int *C = &funcC;
  12.     funcA(13, C);
  13.     return 0;
  14. }
复制代码
  1. 我是函数 funcA,x 是 13
  2. 我是函数 funcC,x 是 13
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-25 14:07:49 | 显示全部楼层
傻眼貓咪 发表于 2021-10-25 14:00
这题目太深,不是很理解,void (*) (int) 里面需要的参数从哪里来?
以下是我所理解的,但是不带参数 int  ...
  1. void (*signal(int sig, void (*func)(int)))(int);
复制代码


http://www.cplusplus.com/reference/csignal/signal/
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-26 00:03:18 | 显示全部楼层
人造人 发表于 2021-10-25 13:27
void *返回值 ( int )

你指的是这样吗?

肯定错啊,代码你都看错我的了。。
我的是:void ( * signal ( int , void ( * ) ( int ) ) )( int );
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-26 00:08:00 | 显示全部楼层
傻眼貓咪 发表于 2021-10-25 14:00
这题目太深,不是很理解,void (*) (int) 里面需要的参数从哪里来?
以下是我所理解的,但是不带参数 int  ...

不需要理解参数从哪里来,我只是想问如何读懂各个部分的意思。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-26 00:08:36 | 显示全部楼层
人造人 发表于 2021-10-25 14:07
http://www.cplusplus.com/reference/csignal/signal/

signal是自定义函数。不是库函数。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-26 02:02:47 | 显示全部楼层
我是第一名 发表于 2021-10-26 00:03
肯定错啊,代码你都看错我的了。。
我的是:void ( * signal ( int , void ( * ) ( int ) ) )( int );

一样的

C语言复杂声明解析
https://blog.csdn.net/wangweixaut061/article/details/6549768
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 00:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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