dpa*_*lma 2 c pointers function
我一直在阅读有关函数作为参数的函数,特别是在C中,它们使用函数指针.让我们假设我想实现牛顿raphson方法(以一种简单的方式)来计算非线性方程中的零点.
double derivative(double f(double), double x)
{
double h = 1e-9;
return (f(x + h) - f(x)) / h;
}
double newton_raphson(double f(double), double x0, double tol)
{
double xk, diff;
do
{
xk = x0 - f(x0) / derivative(f, x0);
diff = fabs(xk - x0);
x0 = xk;
} while (diff >= tol);
return xk;
}
Run Code Online (Sandbox Code Playgroud)
因此,要计算导数的近似值,我需要一个返回double的函数,并将double作为参数.对于计算函数的根,给定其他参数也是如此.我的问题是,为什么这与将函数参数声明为函数指针不同?例如,将输入参数f声明为函数指针而不仅仅是函数...
该参数f是在两个一指针到功能derivative和newton_raphson.
double derivative(double f(double), double x) { ... }
Run Code Online (Sandbox Code Playgroud)
完全等同于
double derivative(double (*f)(double), double x) { ... }
Run Code Online (Sandbox Code Playgroud)
只是,前者看起来更好 - 通常当你可以省略括号时,你应该这样做.毕竟它们都相当于
double ((((derivative)))(double (((*(f))))(double ((trouble))), double ((x)))) { ... }
Run Code Online (Sandbox Code Playgroud)
我希望这只能用于IOCCC.
但是,如果要声明,定义变量(不是函数参数),则需要使用
double (*f)(double);
Run Code Online (Sandbox Code Playgroud)
如
double f(double);
Run Code Online (Sandbox Code Playgroud)
只是一个功能声明.
6.7.6.3 C11草案n1570的函数声明符(包括原型)说:
参数声明为''函数返回类型''应调整为''指向函数返回类型'的指针,如6.3.2.1所述.
而 6.9.1函数定义进一步说,
[...]每个参数的类型按照6.7.6.3中的描述调整参数类型列表; 结果类型应为完整的对象类型.
另外它有以下例子:
例2
有人可能会说,将一个功能传递给另一个功能
Run Code Online (Sandbox Code Playgroud)int f(void); /* ... */ g(f);然后定义
g可能会读Run Code Online (Sandbox Code Playgroud)void g(int (*funcp)(void)) { /* ... * (*funcp)(); /* or funcp(); ... */ }或者,等效地,
Run Code Online (Sandbox Code Playgroud)void g(int func(void)) { /* ... */ func(); /* or (*func)(); ... */ }
| 归档时间: |
|
| 查看次数: |
210 次 |
| 最近记录: |