Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用函数指针返回函数指针?_C_Pointers - Fatal编程技术网

C 如何使用函数指针返回函数指针?

C 如何使用函数指针返回函数指针?,c,pointers,C,Pointers,我在unix中学习信号处理时遇到了这个问题 void (*signal(int sig, void (*func)(int)))(int); 我不理解这个原型以及它如何返回指向函数的指针 我也读到了这个答案: 但我不清楚 它应该返回一个函数指针,但我不明白它在哪里将返回类型指定为另一个函数指针。 在我看来,如果我在函数定义中使用(*foo(int n)),则此函数的返回类型foo(int n)将成为函数指针。这是否正确? 有没有更简单的例子 void (*signal(stuff))(int)

我在unix中学习信号处理时遇到了这个问题

void (*signal(int sig, void (*func)(int)))(int);
我不理解这个原型以及它如何返回指向函数的指针

我也读到了这个答案: 但我不清楚

它应该返回一个函数指针,但我不明白它在哪里将返回类型指定为另一个函数指针。
在我看来,如果我在函数定义中使用
(*foo(int n))
,则此函数的返回类型
foo(int n)
将成为函数指针。这是否正确?
有没有更简单的例子

void (*signal(stuff))(int)
将信号声明为返回指向以int为参数并返回void的函数的指针。stuff将参数提供给signal,在本例中是

(int sig, void (*func)(int))
也就是说,函数信号的第一个参数是int,第二个参数是一个函数指针,它将int作为参数并返回void

编辑:因此,如果你打了一些电话,例如

void foo (int x) {
    return;
}
void *bar = (*signal)(0, &foo);
然后,bar将是一个指针,指向一个函数,该函数取int,不返回任何内容,因此可以按如下方式调用:

(*bar)(0);

那么,让我们看看函数指针是如何声明的

return-type (*function-name)(parameter-list);
在您发布的声明中,有两种函数指针类型在起作用。第一个是传递到与
信号
原型匹配的函数中的参数:

void (*signal(int sig, void (*func)(int)))(int);
//                     ^^^^^^^^^^^^^^^^^
让我们将该函数指针类型重命名为
handler
,并给出它自己的声明

typedef void (*handler)(int);
void (*signal(int sig, handler func))(int);
现在我们可以把宣言的其余部分分解了。“内部”部分是实际的功能声明:

...signal(int sig, handler func)...
“外部”描述它返回的函数指针:

void (...)(int);
这也是与我们的
处理程序
类型相同的函数指针类型,因此在
typedef
就位后,我们可以像这样重新声明
信号
函数:

handler signal(int sig, handler func);

(更漂亮。)

我们可以使用
typedef
简化函数指针定义,这可以帮助您理解冗长而复杂的定义

#include <stdio.h>
typedef void (*func)(int);
typedef void (*rtype)(int);

void myfunc(int a)
{
    printf("A is %d\n", a);
}

// thus signal can be defined as this
// exactly the same as in your question
rtype signal(int a, func handler)
{
    return myfunc;
}

int main()
{
    signal(0, 0)(12);
    return 0;
}
#包括
typedef void(*func)(int);
typedef void(*rtype)(int);
void myfunc(int a)
{
printf(“A是%d\n”,A);
}
//因此,信号可以定义为
//和你的问题完全一样
rtype信号(int a,func处理程序)
{
返回myfunc;
}
int main()
{
信号(0,0)(12);
返回0;
}
上述代码应输出:
A为12


希望有帮助

另外:@millimoose谢谢这些都非常有用。另外,返回类型通过在函数签名后添加参数列表而成为函数指针。(已包含不相关的参数列表。)比较(与
void*foo(int)
相同,但与
void(*foo)(int)
)和。换句话说:函数的返回类型是签名之外的内容,而不仅仅是它的左边。。。。哪一个也是
处理程序
——还是我错了?确实是。让我修改一下我的帖子,让它更清楚一点。如果你调用函数指针,你不需要取消引用。只要做
bar(0)
就可以了。没错,但我发现它有助于记住大型项目中发生的事情。