我知道函数指针存储函数的地址。
int fun(int x){
//return something
}
int (pfun*)(int)=&fun;
int main(){
std::cout << &fun << "\n"; // this print out 1
std::cout << fun << "\n" ; // this print out 1
std::cout << &pfun << "\n"; // this print out 0x0022ff40
std::cout << pfun << "\n" ; // this print out 1
}
所以我的问题是:
1)如果fun()甚至没有地址,pfun如何指向fun()。
2)例如在运行时使用指针函数时的动态绑定。编译器是否将pfun值更改为真正的指针,如0X .....所以在运行时将知道要调用哪个函数,因为编译后名称不存在?
答案 0 :(得分:5)
表达式fun
和&fun
具有相同的含义:&fun
等同于pfun
中存储的值,因此难怪其中的三个产生相同的输出。 &pfun
是指针的地址,它是变量的地址。
现在问题是为什么1
......好吧,答案是没有重载的operator<<
带有std::ostream
和一个函数指针,所以编译器试图找到现有重载之间的最佳匹配恰好是bool
(函数指针可以隐式转换为bool
)。仅当函数指针为空时,函数指针才会转换为false
,但情况并非如此。 true
值最终打印为1
(您可以执行以下操作来检查:std::cout << std::boolalpha << fun
将打印true
)。
如果要获取函数的实际地址(在此过程中),可以强制转换为void指针并打印结果。这可能在技术上不正确,但它会给你一个不同于1
的数字......请注意,不同运行中的值可能不同,基本上没有任何意义。
答案 1 :(得分:1)
operator<<
没有适合打印函数指针的重载。试试这个。
#include <iostream>
void fun() {}
void (*pFun)() = &fun;
int main ()
{
std::cout << (void*)pFun << "\n";
}