函数指针赋值和c ++调用?

syd*_*dgm 5 c++ pointers function

我知道当我们使用函数名作为值时,该函数会自动转换为指针.看下面的代码:

int print(int a)
{
    return a;
}

int main()
{
    int (*p)(int) = print;
    int (*q)(int) = &print;

    cout << p(8) << endl;
    cout << (*p)(8) << endl;
}
Run Code Online (Sandbox Code Playgroud)

为什么int (*p)(int) = print;,打印是一个指针,并且int (*p)(int) = &print;,与打印是一个地址的指针,等价?

另一方面,当我们使用指向函数的指针来调用函数时,为什么p(8)(*p)(8)等价?

Lin*_*gxi 2

print是一个函数,但它可以隐式转换为函数指针类型。引用自cppref

函数到指针
函数类型 T 的左值可以隐式转换为指向该函数的纯右值指针。这不适用于非静态成员函数,因为不存在引用非静态成员函数的左值。

所以,就你而言:

int (*p)(int) = print; // Conversion happens.
int (*q)(int) = &print; // Conversion does not happen.
Run Code Online (Sandbox Code Playgroud)

当需要使程序编译时,隐式转换会自动启动,否则不会应用。

关于函数调用,是关于内置函数调用运算符的()。根据cppref,内置函数调用运算符既适用于引用函数的左值表达式,也适用于指向函数的指针。在你的情况下:

p(8); // The function call operator is applied to a pointer to function.
(*p)(8); // The function call operator is applied to an lvalue reference to function.
Run Code Online (Sandbox Code Playgroud)

供大家参考(重点是我的):

内置函数调用运算符 函数
调用表达式(例如 E(A1, A2, A3))由一个命名函数的表达式 E 组成,后跟一个可能为空的表达式列表 A1、A2、A3... , 在括号内。命名函数的表达式可以是

a)引用函数的左值表达式
b)指向函数的指针
...