可能重复:
如何解除引用函数指针?
如果我们有
void f() {
printf("called");
}
Run Code Online (Sandbox Code Playgroud)
然后,以下代码将导致"calledcalled"的输出:
f();
(*f)();
Run Code Online (Sandbox Code Playgroud)
我真的不明白这是怎么回事...... *f和之间的区别是f什么?为什么要使用后一种语法调用函数?
第一个是第二个的语法糖.第二个显然是你通过一个指针进行调用,它主要用于函数指针而不是常规函数,以使区别更明显.
有两种方法可以在C++中调用函数:
按名字:
f();
Run Code Online (Sandbox Code Playgroud)
通过函数指针:
typedef void (*fptr_t)();
fptr_t fptr = &f;
(*fptr)();
Run Code Online (Sandbox Code Playgroud)
现在,在函数名(&f)上使用address-of运算符显然会创建一个函数指针.但是,当满足某些条件时,函数名称可以隐式转换为函数指针.所以上面的代码可以写成:
typedef void (*fptr_t)();
fptr_t fptr = f; // no address-of operator, implicit conversion
(*fptr)();
Run Code Online (Sandbox Code Playgroud)
您的第二个示例正是这样做,但使用临时变量来保存函数指针而不是命名的局部变量.
我更喜欢在创建函数指针时使用address-of,意思更清晰.
相关注释:函数调用操作符将自动取消引用函数指针(如果提供了一个).所以这也是合法的:
typedef void (*fptr_t)();
fptr_t fptr = &f;
fptr();
Run Code Online (Sandbox Code Playgroud)
这对于模板非常有用,因为无论您是operator()传入函数指针还是函数(实现对象),相同的语法都可以工作.
并且这两个快捷方式都不适用于指向成员的指针,您需要明确的地址和解除引用操作符.
| 归档时间: |
|
| 查看次数: |
285 次 |
| 最近记录: |