函数指针存储的地址在哪里

时间:2012-04-06 02:33:32

标签: c++ function pointers

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

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 .....所以在运行时将知道要调用哪个函数,因为编译后名称不存在?

2 个答案:

答案 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";
}