2

我知道函数指针存储函数的地址。

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 之类的真实指针......以便在运行时知道要调用哪个函数,因为编译后名称不存在?

4

2 回答 2

5

表达式fun&fun具有相同的含义:&fun相当于存储在 中的值pfun,因此它们三个产生相同的输出也就不足为奇了。&pfun是指针的地址,也就是变量的地址。

现在的问题是为什么1......嗯,答案是没有重载operator<<需要一个std::ostream和一个函数指针,所以编译器试图找到现有重载之间的最佳匹配,这恰好是bool(函数指针是隐式可转换的到bool)。只有当函数指针为空时,函数指针才会被转换false为空,事实并非如此。该true值最终打印为1(您可以通过执行以下操作进行检查:std::cout << std::boolalpha << funwhich will print true)。

如果要获取函数的实际地址(在此过程中),可以强制强制转换为 void 指针并打印结果。这在技术上可能不正确,但它会给您一个不同于1...的数字。请注意,该值在不同的运行中可能会有所不同,并且基本上没有任何意义。

于 2012-04-06T02:44:56.883 回答
1

operator<<没有用于打印函数指针的适当重载。试试这个。

#include <iostream>

void fun() {}

void (*pFun)() = &fun;

int main ()
{
  std::cout << (void*)pFun << "\n";
}
于 2012-04-06T02:44:43.077 回答