函数指针
本帖最后由 我是第一名 于 2021-10-25 11:19 编辑有这么一个代码:
void ( * signal ( int , void ( * ) ( int ) ) )( int )
能否解释一下是什么意思?
signal 是一个函数名 void (*signal(int, void (*)(int)))(int)
多了一层括号,看着不习惯,去掉
void *signal(int, void (*)(int))(int)
signal 是一个函数,有两个参数,一个返回值
第 0 个参数是 int 类型
第 1 个参数是一个指针,指向函数的指针,函数有一个 int 类型的参数,没有返回值
返回值是一个指针,指向函数的指针,指向的这个函数有一个 int 类型的参数,没有返回值
人造人 发表于 2021-10-25 11:27
大佬你去掉括号那最后一个 ( int )不就先和signal的返回值先结合了?
还有就是我怎么去确定signal的返回类型? https://blog.csdn.net/tonglin12138/article/details/93657393 我是第一名 发表于 2021-10-25 11:51
大佬你去掉括号那最后一个 ( int )不就先和signal的返回值先结合了?
还有就是我怎么去确定signal的返回 ...
? 我是第一名 发表于 2021-10-25 11:51
大佬你去掉括号那最后一个 ( int )不就先和signal的返回值先结合了?
还有就是我怎么去确定signal的返回 ...
那加了括号呢?
加了括号不也是 最后一个 ( int )和signal的返回值先结合 ?
人造人 发表于 2021-10-25 12:36
?
就是你去掉括号来看改变了原来的运算顺序 人造人 发表于 2021-10-25 12:56
那加了括号呢?
加了括号不也是 最后一个 ( int )和signal的返回值先结合 ?
加了括号就是
void (* 返回值 ) ( int )
先和 * 结合了整体看是一个函数指针
你不要括号就是
void *返回值 ( int )
返回值和 ( int )先结合 显然不是个函数指针。。 我是第一名 发表于 2021-10-25 13:12
加了括号就是
void (* 返回值 ) ( int )
先和 * 结合了整体看是一个函数指针
事实是不会这样
(int) 是一个函数
返回值和函数先结合是什么意思?一个函数返回一个函数?不
不加括号也是先看左边的 *,* 表示是一个指针,然后再看右边,右边是 (int)
说明这个返回的指针指向一个函数
我是第一名 发表于 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-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,无返回值的函数”
这题目太深,不是很理解,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:00
这题目太深,不是很理解,void (*) (int) 里面需要的参数从哪里来?
以下是我所理解的,但是不带参数 int...
void (*signal(int sig, void (*func)(int)))(int);
http://www.cplusplus.com/reference/csignal/signal/ 人造人 发表于 2021-10-25 13:27
void *返回值 ( int )
你指的是这样吗?
肯定错啊,代码你都看错我的了。。
我的是:void ( * signal ( int , void ( * ) ( int ) ) )( int );
傻眼貓咪 发表于 2021-10-25 14:00
这题目太深,不是很理解,void (*) (int) 里面需要的参数从哪里来?
以下是我所理解的,但是不带参数 int...
不需要理解参数从哪里来,我只是想问如何读懂各个部分的意思。 人造人 发表于 2021-10-25 14:07
http://www.cplusplus.com/reference/csignal/signal/
signal是自定义函数。不是库函数。。 我是第一名 发表于 2021-10-26 00:03
肯定错啊,代码你都看错我的了。。
我的是:void ( * signal ( int , void ( * ) ( int ) ) )( int );
一样的
C语言复杂声明解析
https://blog.csdn.net/wangweixaut061/article/details/6549768
页:
[1]