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

时间:2015-11-04 14:54:40

标签: c++ function pointers

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

int print(int a)
{
    return a;
}

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

    cout << p(8) << endl;
    cout << (*p)(8) << endl;
}

为什么int (*p)(int) = print;打印是指针,而int (*p)(int) = &print;&amp; print 是指针的地址,相当于?

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

2 个答案:

答案 0 :(得分:3)

print 不是指针。其类型为int(int),而非int(*)(int)。这种区别在类型推导中尤为重要

auto& f = print;   //type of f is int(&)(int), not int(*(&))(int)
template<typename Func>
foo(Func& f);
foo(print);  //Func is deduced to be int(int), not int(*)(int)

类似于数组,您不能“按值”复制函数,但可以传递其地址。例如,

int arr[4];     //the type of arr is int[4], not int*
int *a = arr;   //automatic array-to-pointer decay
int (*a)[4] = &arr;  //type match 
int (*p)(int) = print;  //automatic function-to-pointer decay
int (*p)(int) = &print; //type match

现在,当您通过print致电p时,

p(8)     //automatic dereferencing of p
(*p)(8)  //manual dereferencing of p

答案 1 :(得分:2)

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

  

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

所以,在你的情况下:

int (*p)(int) = print; // Conversion happens.
int (*q)(int) = &print; // Conversion does not happen.

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

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

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.

供你参考(强调我的):

  

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

     

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