我想知道当我们想要为函数指针赋值时,可以多次使用解除引用运算符*
的具体原因。
例如,以下代码完美地编译并运行:
#include <iostream>
void f() { std::cout << "Hello World!" << std::endl; }
int main() {
void(*f_ptr)(void) = ***************************************f;
f_ptr();
return 0;
}
答案 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
以指向指向指针的指针。因此,您可以根据需要进行链接,父指针的地址将只保存其子指针的地址。双指针通常用于初始化函数中的变量。