我正在尝试做类似
的事情#include <iostream>
using namespace std;
void foo () {
void (*fooptr) (void) = foo;
cout << fooptr << endl;
}
int main () {
void (*fooptr) (void) = foo;
foo ();
return 0;
}
我的目的是看到函数指针的值。如果我查找main ()
函数中任何函数的地址,那么有意义的是函数没有被调用,它可能没有被分配给函数调用堆栈中的内存。但是当我调用函数并尝试查看指针的值时。它仍显示相同的结果1
。任何解释?
我可能不会打印被调用函数本身的地址。是否像我们在课堂上一样有this
之类的指针。那么我们可以看到它自己的地址吗?
答案 0 :(得分:0)
标准流类型不会为函数指针重载<<
,仅针对常规指针。您会看到值1,因为函数指针可以隐式转换为bool
,并且bool
存在重载,因此选择它。
要打印地址,您可以将其转换为常规(对象)指针:
cout << reinterpret_cast<void*>(fooptr) << std::endl;
请注意,这不是完全可移植的:根据标准,它是有条件支持的,具有实现定义的含义。但它应该在主流平台上的任何合理实现上给出预期的地址,这些平台将函数存储在常规内存中。为了更具可移植性,您可以转换为intptr_t
或uintptr_t
;但是如果你希望它被格式化为指针,你需要一些额外的工作。