各位,我有这段代码:
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;
}
如何定义指向函数的指针是否重要:
1) void (*ptr_foo);
2) void (*ptr_foo)(int, int);
我的编译器收到两个版本
预先感谢您对差异的解释
最佳答案
这两种形式并不等同。
void (*ptr_foo)
根本不是函数指针。这是一个普通的非函数空指针。括号是多余的和误导的。就像您编写了 void* ptr_foo
一样。
void (*ptr_foo)(int, int)
是声明函数指针的正确方法,该函数指针指向接受两个 int
并返回 void< 的函数
.
唯一可行的原因是因为在 C 中,void
指针可以隐式转换为任何其他类型的指针。也就是说,您可以将任何其他指针分配给 void*
,也可以将 void*
分配给任何其他指针。
但是在这个例子中它起作用的事实本质上是语法上的意外。您通常不能将 void (*foo)(int, int)
替换为 void (*foo)
。
如果您尝试使用 foo_for_foo
的参数列表中的 some_function
执行此操作,当您尝试调用 some_function
时编译器会报错,因为它不是函数指针。
同样,如果您的 foo
函数恰好返回 int
而不是 void
,您会立即注意到问题。将 ptr_foo
声明为 int (*ptr_foo)
会导致语句 ptr_foo = &foo
出错,因为与 void
不同> 指针,int
指针不能隐式转换为其他指针类型。
简而言之,始终使用第二种形式。尽管有这种侥幸的情况,但它是唯一在一般情况下是正确的。
关于c - 定义函数指针的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3817395/