我想将一个函数传递给另一个函数,但是我对语法和实际发生的事情感到很困惑。这是我正在运行的代码:
#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神,让他们从睡梦中得到详细的解释吗?我真的不知道这是如何工作的,传递的是什么等等。
答案 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);
}