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

Ale*_*Dan 2 c++ pointers function

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

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

 }
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:
1)如果fun()甚至没有地址,pfun如何指向fun().
2)例如在运行时使用指针函数时的动态绑定.编译器是否将pfun值更改为真正的指针,如0X .....因此在运行时将知道要调用哪个函数,因为编译后名称不存在?

Dav*_*eas 5

表达fun&fun具有相同的含义:&fun这相当于存储在值pfun,所以难怪他们三人产生相同的输出.&pfun是指针的地址,它是变量的地址.

现在问题是为什么1......好吧,答案是没有重载operator<<需要一个std::ostream和一个函数指针,所以编译器试图在现有的重载之间找到最佳匹配bool(函数指针可以隐式转换) to bool).false仅当函数指针为空时,函数指针才会转换为空,否则不是这种情况.该true值最终打印为1(您可以通过执行以下操作来检查:std::cout << std::boolalpha << fun将打印true).

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