【发布时间】:2017-08-24 02:34:50
【问题描述】:
我已经测试了以下代码:
#include <stdio.h>
void f(void g()) {
g();
}
void g(void) {
printf("hello, world\n");
}
int main() {
f(g);
return 0;
}
效果很好。在上面的代码中,为什么在c中我们可以将函数名g作为参数,并将函数原型作为参数?
在 K&R 书中,它说我们可以使用函数指针:
所以我可以像这样定义函数f:
void f(void (*g)()) {
g();
}
void g(void) {
printf("hello, world\n");
}
int main() {
void (*pf)() = g;
f(pf);
f(g); // Here f(g) also works.
return 0;
}
所以在第一个f定义形式中,参数原型是void g(),在第二个形式中参数原型是void (*g)()。为什么f的两种定义形式是一样的?
而在第二种形式中,参数是指向函数的指针,为什么f(g)也有效?
【问题讨论】:
-
在大多数情况下,函数名被转换为函数指针。
-
也就是说,我们在大多数情况下都可以使用函数名作为指针,那么我可以说不需要定义指向函数的指针吗?然后我可以直接使用函数名作为其他语言。
-
@zhenguoli:就像
void f(int a[]),其中a实际上是int *类型,而不是int[]。 -
不,你不能这么说。
-
@n.m.为什么?指向函数的任何原因或优势?
标签: c function function-pointers standards