我是第一名 发表于 2021-10-25 11:16:53

函数指针

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

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

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

signal 是一个函数名

人造人 发表于 2021-10-25 11:27:48

void (*signal(int, void (*)(int)))(int)

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

signal 是一个函数,有两个参数,一个返回值
第 0 个参数是 int 类型
第 1 个参数是一个指针,指向函数的指针,函数有一个 int 类型的参数,没有返回值
返回值是一个指针,指向函数的指针,指向的这个函数有一个 int 类型的参数,没有返回值

我是第一名 发表于 2021-10-25 11:51:06

人造人 发表于 2021-10-25 11:27


大佬你去掉括号那最后一个 ( int )不就先和signal的返回值先结合了?
还有就是我怎么去确定signal的返回类型?

2736946915 发表于 2021-10-25 12:33:43

https://blog.csdn.net/tonglin12138/article/details/93657393

人造人 发表于 2021-10-25 12:36:13

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

?

人造人 发表于 2021-10-25 12:56:25

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

那加了括号呢?
加了括号不也是 最后一个 ( int )和signal的返回值先结合 ?

我是第一名 发表于 2021-10-25 12:56:31

人造人 发表于 2021-10-25 12:36
?

就是你去掉括号来看改变了原来的运算顺序

我是第一名 发表于 2021-10-25 13:12:35

人造人 发表于 2021-10-25 12:56
那加了括号呢?
加了括号不也是 最后一个 ( int )和signal的返回值先结合 ?

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

你不要括号就是
void *返回值 ( int )
返回值和 ( int )先结合 显然不是个函数指针。。

人造人 发表于 2021-10-25 13:23:25

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


事实是不会这样
(int) 是一个函数
返回值和函数先结合是什么意思?一个函数返回一个函数?不
不加括号也是先看左边的 *,* 表示是一个指针,然后再看右边,右边是 (int)
说明这个返回的指针指向一个函数

人造人 发表于 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));
      ^~~~~~


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

番杰 发表于 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,无返回值的函数”

傻眼貓咪 发表于 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

人造人 发表于 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/

我是第一名 发表于 2021-10-26 00:03:18

人造人 发表于 2021-10-25 13:27
void *返回值 ( int )

你指的是这样吗?


肯定错啊,代码你都看错我的了。。
我的是:void ( * signal ( int , void ( * ) ( int ) ) )( int );

我是第一名 发表于 2021-10-26 00:08:00

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

不需要理解参数从哪里来,我只是想问如何读懂各个部分的意思。

我是第一名 发表于 2021-10-26 00:08:36

人造人 发表于 2021-10-25 14:07
http://www.cplusplus.com/reference/csignal/signal/

signal是自定义函数。不是库函数。。

人造人 发表于 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
页: [1]
查看完整版本: 函数指针