在为函数指针赋值时,为什么可以多次使用解除引用运算符?

时间:2016-12-12 09:39:06

标签: c++

我想知道当我们想要为函数指针赋值时,可以多次使用解除引用运算符*的具体原因。 例如,以下代码完美地编译并运行:

#include <iostream>

void f() { std::cout << "Hello World!" << std::endl; }

int main() {
    void(*f_ptr)(void) = ***************************************f;
    f_ptr();
    return 0;
} 

3 个答案:

答案 0 :(得分:12)

函数和函数引用会在必要时衰减到函数指针。没有为函数定义的dereference运算符,但是有一个用于函数指针:函数或函数的引用很快就会衰减到指针,只是再次变为dereferncence。

答案 1 :(得分:3)

一方面,根据C标准(6.3.2.1 Lvalues,数组和函数指示符)

  

4函数指示符是具有函数类型的表达式。除了   当它是sizeof operator65的操作数或者一元&amp;   operator,一个函数指示符,类型为''函数返回类型''   转换为具有类型''指向函数的指针的表达式   返回类型''。

并根据C ++标准(4.3函数到指针转换)

  

1 函数类型T的左值可以转换为类型的prvalue   “指向T的指针”结果是指向函数的指针

另一方面,根据C标准(6.5.3.2地址和间接运算符)

  

4一元*运算符表示间接。 如果操作数指向   一个函数,结果是函数指示符;

和C ++标准(5.3.1一元运算符)

  

1一元*运算符执行间接:表达式   应用它应该是指向对象类型的指针,或指向a的指针   函数类型和结果是引用对象的左值或   表达式指向的函数。如果是的类型   表达式是“指向T的指针”,结果的类型是“T”。

因此存在递归转换。首先从函数指示符到指针然后从指针指向函数指示符(或者在C ++标准中写入以引用函数的左值)并再次从函数指示符或左值函数指针等等。

答案 2 :(得分:-4)

您正在初始化f_ptr以指向指向指针的指针。因此,您可以根据需要进行链接,父指针的地址将只保存其子指针的地址。双指针通常用于初始化函数中的变量。