将函数传递给C中的另一个函数

时间:2017-01-17 23:45:24

标签: c function pointers arguments

我想将一个函数传递给另一个函数,但是我对语法和实际发生的事情感到很困惑。这是我正在运行的代码:

#include <stdio.h>

int func(int a){
    printf("%d\n", a);
}

void another_func(int p_func(int)){
int (*funcptr)(int) = p_func;
funcptr(7);
}

int main(void){

    another_func(func);

    return 0;
}

但是,我发现在main中调用它之前我可以在func之前输入多少asterix,例如:

another_func(*******************func);

将函数指定给函数指针时,我也可以这样做,例如:

int (*funcptr)(int) = ***********p_func;

我将禁止在将其分配给函数指针时在p_func前放置一个&符号。如果我写的话,它似乎并不重要:

void another_func(int (*p_func)(int)){

我可以请求帮助唤醒一些传说中的C神,让他们从睡梦中得到详细的解释吗?我真的不知道这是如何工作的,传递的是什么等等。

2 个答案:

答案 0 :(得分:2)

根据C标准(6.3.2.1 Lvalues,数组和函数指示符)

  

4函数指示符是具有函数类型的表达式。   除非它是sizeof operator65)或一元&amp;的操作数。   operator,一个函数指示符,类型为''函数返回类型''   转换为具有类型''指向函数的指针的表达式   返回类型“

另一方面(6.5.3.2地址和间接运算符)

  

4一元*运算符表示间接。 如果操作数指向   一个函数,结果是函数指示符;

因此,您可以在函数指示符之前放置尽可能多的星号,因为编译器将根据自己的限制允许。:)

您可以将运算符&与函数指示符一起使用。例如

#include <stdio.h>

int f( int x )
{
    return x;
}

int main(void) 
{
    int ( *fp )( int ) = &f;

    printf( "%d\n", fp( 10 ) );

    return 0;
}

考虑将声明为函数的函数参数调整为指向函数类型的指针。

因此,这两个函数声明声明了相同的一个函数,并且可以同时存在于编译单元中(尽管如果函数不是内联函数,则该函数应定义一次)

void another_func(int p_func(int));
void another_func(int ( *p_func )(int));

答案 1 :(得分:0)

&#34;我发现在主要调用它之前我可以在func之前输入多少asterix。&#34; 我不想冒犯你,但我建议你阅读有关指针的内容。关于您正在寻找的内容的一个例子可能是:

int foo(int (*foo2)(void))
{
    foo2();
}

int foo2(void)
{
    return rand();
}

int main(void)
{
    foo(foo2);
}