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)
广告无限。
一切都崩溃了。
如果将函数参数指定为函数声明,则编译器本身会隐式地将参数调整为函数指针。
例如,类似于将函数名称作为其他函数的参数传递时
fin_diff( func_name, 10.0 );
Run Code Online (Sandbox Code Playgroud)
编译器再次将函数指示符隐式转换为指向函数的指针。
| 归档时间: |
|
| 查看次数: |
1123 次 |
| 最近记录: |