不带星号的函数指针参数

Fre*_*man 21 c c++ function-pointers function-declaration

我已经看到了将函数指针作为参数的函数定义:

double fin_diff(double f(double), double x, double h  = 0.01) {
  return (f(x+h)-f(x)) / h;
}
Run Code Online (Sandbox Code Playgroud)

我习惯用星号来查看此定义,即:

double fin_diff(double (*f)(double), double x, double h  = 0.01);
Run Code Online (Sandbox Code Playgroud)

您知道为什么第一个定义也有效吗?

use*_*670 24

Standard说这两个函数是等效的,因为将函数参数调整为指向函数参数的指针:

16.1可重载声明[over.load]
(3.3)参数声明的不同之处仅在于一个是函数类型,另一个是指向相同函数类型的指针。即,将函数类型调整为指向函数类型(11.3.5)的指针。

在C中相同:

6.7.5.3函数声明符(包括原型)
8应将参数声明为“函数返回类型”声明调整为“指向函数返回类型的指针”,如6.3.2.1所述。


Pet*_*ker 17

功能的指针是特殊的。给定一个功能void f();,你可以做

void (*fptr)() = f;
void (*fptr)() = &f;
void (*fptr)() = &&f;
void (*fptr)() = &&&f;
Run Code Online (Sandbox Code Playgroud)

广告无限。

同样,当您通过指向函数的指针调用函数时,您可以执行

fptr();
(*fptr)();
(**fptr)();
(***fptr)();
Run Code Online (Sandbox Code Playgroud)

广告无限。

一切都崩溃了。


Vla*_*cow 7

如果将函数参数指定为函数声明,则编译器本身会隐式地将参数调整为函数指针。

例如,类似于将函数名称作为其他函数的参数传递时

fin_diff( func_name, 10.0 );
Run Code Online (Sandbox Code Playgroud)

编译器再次将函数指示符隐式转换为指向函数的指针。