c/c++中函数的值

value of function in c/C++

本文关键字:函数 c++      更新时间:2023-10-16

可能重复:
函数指针的取消引用是如何发生的?

如果我们有

void f() {
    printf("called");
}

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

f();
(*f)();

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

在C++中有两种方法可以调用函数:

按名称:

f();

通过函数指针:

typedef void (*fptr_t)();
fptr_t fptr = &f;
(*fptr)();

现在,在函数名(&f(上使用运算符的地址显然会创建一个函数指针。但是,当满足某些条件时,函数名称可以隐式转换为函数指针。所以上面的代码可以写成:

typedef void (*fptr_t)();
fptr_t fptr = f; // no address-of operator, implicit conversion
(*fptr)();

您的第二个示例正是这样做的,但使用一个临时变量来保存函数指针,而不是使用一个命名的局部变量。

我更喜欢在创建函数指针时使用的地址,其含义要清晰得多。

相关注意事项:如果提供了函数指针,函数调用运算符将自动取消引用函数指针。所以这也是合法的:

typedef void (*fptr_t)();
fptr_t fptr = &f;
fptr();

这对模板非常有用,因为无论传入函数指针还是函子(实现operator()的对象(,都可以使用相同的语法

这两种快捷方式都不适用于指向成员的指针,因此需要显式的地址和取消引用运算符。


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

第一个在某种程度上是第二个的语法糖。第二个可以明显看出,您是通过指针进行调用的,它主要用于函数指针,而不是常规函数,以使区别更加明显。

正如数组类型几乎完全等同于对应的指向元素类型的指针一样,函数类型也完全等同于相应的指向函数类型的指针:

void (*func1)() = f;  // function type -> pointer-to-function type
void (*func2)() = &f; // pointer-to-function type -> pointer-to-function type

以及

void (*func)() = ...;
func();               // pointer-to-function type + function-call operator
(*func)();            // function type + function-call operator

因此,在中

(*f)();

您正在取消引用f(隐式转换为&f(,然后应用函数调用运算符。