Jea*_*Luc 4 c function-pointers function
我注意到似乎有不同的方法将函数作为参数传递给另一个函数.原型是:
void foo1(double f(double));
Run Code Online (Sandbox Code Playgroud)
和
void foo2(double (*f)(double));
Run Code Online (Sandbox Code Playgroud)
这两者有区别吗?他们是以同样的方式实施的吗?有没有其他方法来传递函数?
第二种可以说是写"正确"的方式.它说参数foo1()是指向函数的指针.第一个说参数是一个函数,但你不能将函数本身作为函数传递,因此编译器将其视为函数的指针.所以,在实践中,它们是等价的 - 在这种情况下.但是,在其他情况下,您将无法使用该double f(double);表示法来声明指向函数的指针.
ISO/IEC 9899:2011§6.7.6.3函数声明符(包括原型)
8参数声明为"函数返回类型 "应调整为"指向函数返回类型的指针",如6.3.2.1所述.
你能举个例子
double f(double);说不行吗?
#include <math.h>
double (*pointer)(double) = sin;
double function(double); // This declares the existence of 'function()'
Run Code Online (Sandbox Code Playgroud)
这是在文件范围; 它也可以在代码块中,例如在函数内部.指向函数表示法的指针可以按预期工作.plain函数只是声明一个函数 - 而不是保存指向函数的指针的变量.
符号(松散地)等效的唯一位置是函数参数列表:
声明:
double integrate(double lo, double hi, double (*function)(double));
double differentiate(double lo, double hi, double function(double));
Run Code Online (Sandbox Code Playgroud)
定义:
double integrate(double lo, double hi, double (*function)(double))
{
...
}
double differentiate(double lo, double hi, double function(double))
{
...
}
Run Code Online (Sandbox Code Playgroud)
函数或函数指针参数可以在这些声明和定义中互换使用,但仅在参数列表中使用 - 而不是在函数体中.
因为显式的"指向函数的指针"符号在任何地方都有效,而另一种符号只能在一组非常有限的地方工作,所以你通常应该使用显式的"指向函数的指针"表示法,即使它更加冗长.