大家好,我有这段代码:
void foo(int var, int var1)
{
printf("%d\n", var);
printf("%d\n", var1);
}
void foo_for_foo( void (*some_function)(int, int))
{
int x = 5;
some_function(x, x);
}
int main()
{
void (*ptr_foo); // <- look here
ptr_foo = &foo;
foo_for_foo(ptr_foo);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如何定义函数指针是否重要:
1) void (*ptr_foo);
2) void (*ptr_foo)(int, int);
Run Code Online (Sandbox Code Playgroud)
我的编译器收到两个版本
提前感谢解释差异
这两种形式并不相同.
void (*ptr_foo)根本不是函数指针.这是一个普通的非函数void指针.括号是多余的和误导性的.这就像你写的那样void* ptr_foo.
void (*ptr_foo)(int, int)是一个声明函数指针的正确方法,该函数指针指向一个带两个ints并返回的函数void.
这种方法的唯一原因是因为在C中,void指针可以隐式转换为任何其他类型的指针.也就是说,您可以将任何其他指针指定给a void*,并且可以将a指定void*给任何其他指针.
但是这个在这个例子中起作用的事实本质上是语法的意外.你不能在一般的更换void (*foo)(int, int)用void (*foo).
如果您尝试some_function在参数列表中执行此操作foo_for_foo,您的编译器将在您尝试调用时抱怨,some_function因为它不是函数指针.
同样,如果您的foo函数碰巧返回int而不是void,您会立即注意到问题.声明ptr_foo作为int (*ptr_foo)将导致在语句中的错误ptr_foo = &foo,因为不像void指针,int指针不是隐式转换为其他指针类型.
简而言之,始终使用第二种形式.尽管存在这种不稳定的情况,但它是唯一一个正确的.