c/C++中的函数值

Aar*_*ken 6 c c++

可能重复:
如何解除引用函数指针?

如果我们有

void f() {
    printf("called");
}
Run Code Online (Sandbox Code Playgroud)

然后,以下代码将导致"calledcalled"的输出:

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

我真的不明白这是怎么回事...... *f和之间的区别是f什么?为什么要使用后一种语法调用函数?

Meh*_*dad 6

第一个是第二个的语法糖.第二个显然是你通过一个指针进行调用,它主要用于函数指针而不是常规函数,以使区别更明显.

  • @Matti:不,第二个是*取消引用*指针并调用函数,这是第一个*隐式*所做的.(```符号有几个含义 - 除了乘法之外,它可以是解除引用*运算符*和指针*声明*.不要让它们混淆.) (2认同)
  • 伙计们,`f`和`*f`是一回事,因为间接运算符在应用于函数时会返回一个与函数本身相同的函数指示符.这将在[此处]详细讨论(http://stackoverflow.com/questions/2795575/how-does-dereferencing-of-a-function-pointer-happen). (2认同)

Ben*_*igt 6

有两种方法可以在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()传入函数指针还是函数(实现对象),相同的语法都可以工作.

并且这两个快捷方式都不适用于指向成员的指针,您需要明确的地址和解除引用操作符.


在C中,@ Mehrdad解释所有函数调用都使用函数指针.