鱼C论坛

 找回密码
 立即注册
查看: 1434|回复: 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)
signal ( int , void ( * ) ( int ) )
signal是一个函数:

(2)该函数有两个参数:
int , void ( * ) ( int )
第一个参数:int类型
第二个参数:是一个函数指针,它指向的是一个   “参数为int,无返回值的函数”

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

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

使用道具 举报

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

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

signal 是一个函数,有两个参数,一个返回值
第 0 个参数是 int 类型
第 1 个参数是一个指针,指向函数的指针,函数有一个 int 类型的参数,没有返回值
返回值是一个指针,指向函数的指针,指向的这个函数有一个 int 类型的参数,没有返回值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

大佬你去掉括号那最后一个 ( int )不就先和signal的返回值先结合了?
还有就是我怎么去确定signal的返回类型?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-25 12:33:43 | 显示全部楼层
https://blog.csdn.net/tonglin12138/article/details/93657393
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

那加了括号呢?
加了括号不也是 最后一个 ( int )和signal的返回值先结合 ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

就是你去掉括号来看改变了原来的运算顺序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

你不要括号就是
void *返回值 ( int )
返回值和 ( int )先结合 显然不是个函数指针。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

事实是不会这样
(int) 是一个函数
返回值和函数先结合是什么意思?一个函数返回一个函数?不
不加括号也是先看左边的 *,* 表示是一个指针,然后再看右边,右边是 (int)
说明这个返回的指针指向一个函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

void *返回值 ( int )

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

你可以用编译器编译一下这样的代码,会报错的,语法错误
main.c:4:8: error: ‘signal’ declared as function returning a function
 void *(signal(int, void (*)(int))(int));
        ^~~~~~

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

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

使用道具 举报

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

拆看,一部分一部分的看:
(1)
signal ( int , void ( * ) ( int ) )
signal是一个函数:

(2)该函数有两个参数:
int , void ( * ) ( int )
第一个参数:int类型
第二个参数:是一个函数指针,它指向的是一个   “参数为int,无返回值的函数”

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

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

使用道具 举报

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

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

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

int main()
{
    int *C = &funcC;
    funcA(13, C);
    return 0;
}
我是函数 funcA,x 是 13
我是函数 funcC,x 是 13
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

http://www.cplusplus.com/reference/csignal/signal/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你指的是这样吗?

肯定错啊,代码你都看错我的了。。
我的是:void ( * signal ( int , void ( * ) ( int ) ) )( int );
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不需要理解参数从哪里来,我只是想问如何读懂各个部分的意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

signal是自定义函数。不是库函数。。
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 18:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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