猿问

如何用cout打印函数指针?

如何用cout打印函数指针?

我想使用cout打印一个函数指针,发现它不起作用。但是,在我将函数指针转换为(void*)之后,带有%p的printf也起了作用,例如

#include <iostream>using namespace std;int foo() {return 0;}int main(){
    int (*pf)();
    pf = foo;
    cout << "cout << pf is " << pf << endl;
    cout << "cout << (void *)pf is " << (void *)pf << endl;
    printf("printf(\"%%p\", pf) is %p\n", pf);
    return 0;}

我用g+编译了它,得到了如下结果:

cout<pf为1
cout<(void*)pf为0x100000b0c
printf(“%p”,pf)为0x100000b0c。

那么cout如何处理int(*)()类型呢?我被告知函数指针被视为bool,是真的吗?cout对类型(void*)做什么?

提前谢谢。

编辑:无论如何,我们可以通过将函数指针转换为(void*)并使用cout打印出来观察函数指针的内容。但是它不适用于成员函数指针,编译器抱怨非法转换。我知道成员函数指针是一个非常复杂的结构,而不是简单的指针,但是我们如何观察成员函数指针的内容呢?


慕桂英4014372
浏览 1039回答 3
3回答

米琪卡哇伊

实际上,<操作符的重载如下所示:ostream&nbsp;&&nbsp;operator&nbsp;<<(&nbsp;ostream&nbsp;&,&nbsp;const&nbsp;void&nbsp;*&nbsp;);这就像你所期望的-以六角表示输出。函数指针不可能有这样的标准库重载,因为它们的类型是无限的。因此指针被转换成另一种类型,在这种情况下,这似乎是一个bool-我不能随手记住这方面的规则。编辑:C+标准指定:4.12布尔变换1算术、枚举、指针或成员类型指针的r值可转换为bool类型的r值。这是为函数指针指定的唯一转换。

侃侃尔雅

关于您的编辑,您可以通过以下方式打印出任何内容unsigned char指针。指向成员函数的指针示例:#include&nbsp;<iostream>#include&nbsp;<iomanip>struct&nbsp;foo&nbsp;{&nbsp;virtual&nbsp;void&nbsp;bar(){}&nbsp;};struct&nbsp;foo2&nbsp;{&nbsp;};struct&nbsp;foo3&nbsp;:&nbsp; foo2,&nbsp;foo&nbsp;{&nbsp;virtual&nbsp;void&nbsp;bar(){}&nbsp;};int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;(foo3::*p)()&nbsp;=&nbsp;&foo::bar; &nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;const&nbsp;*&nbsp;first&nbsp;=&nbsp;reinterpret_cast<unsigned&nbsp;char&nbsp;*>(&p); &nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;const&nbsp;*&nbsp;last&nbsp;=&nbsp;reinterpret_cast<unsigned&nbsp;char&nbsp;*>(&p&nbsp;+&nbsp;1); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;&nbsp;first&nbsp;!=&nbsp;last;&nbsp;++first) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;std::hex&nbsp;<<&nbsp;std::setw(2)&nbsp;<<&nbsp;std::setfill('0') &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<<&nbsp;(int)*first&nbsp;<<&nbsp;'&nbsp;'; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;std::endl;}
随时随地看视频慕课网APP
我要回答