C为什么函数指针作为参数而不仅仅是函数?

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声明为函数指针而不仅仅是函数...

Ant*_*ala 7

该参数f是在两个一指针到功能derivativenewton_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

有人可能会说,将一个功能传递给另一个功能

int f(void);
/* ... */
g(f);
Run Code Online (Sandbox Code Playgroud)

然后定义g可能会读

void g(int (*funcp)(void))
{
      /* ... *
      (*funcp)(); /* or funcp(); ... */
}
Run Code Online (Sandbox Code Playgroud)

或者,等效地,

void g(int func(void))
{
      /* ... */
      func(); /* or (*func)(); ... */
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,在C参数中,数组重写为对象指针,参数是函数重写函数指针. (2认同)