为了账号安全,请及时绑定邮箱和手机立即绑定

如何用cout打印函数指针?

如何用cout打印函数指针?

C++
慕桂英4014372 2019-07-03 10:13:53
如何用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为1cout<(void*)pf为0x100000b0cprintf(“%p”,pf)为0x100000b0c。那么cout如何处理int(*)()类型呢?我被告知函数指针被视为bool,是真的吗?cout对类型(void*)做什么?提前谢谢。编辑:无论如何,我们可以通过将函数指针转换为(void*)并使用cout打印出来观察函数指针的内容。但是它不适用于成员函数指针,编译器抱怨非法转换。我知道成员函数指针是一个非常复杂的结构,而不是简单的指针,但是我们如何观察成员函数指针的内容呢?
查看完整描述

3 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

实际上,<操作符的重载如下所示:

ostream & operator <<( ostream &, const void * );

这就像你所期望的-以六角表示输出。函数指针不可能有这样的标准库重载,因为它们的类型是无限的。因此指针被转换成另一种类型,在这种情况下,这似乎是一个bool-我不能随手记住这方面的规则。

编辑:C+标准指定:

4.12布尔变换

1算术、枚举、指针或成员类型指针的r值可转换为bool类型的r值。

这是为函数指针指定的唯一转换。


查看完整回答
反对 回复 2019-07-03
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

关于您的编辑,您可以通过以下方式打印出任何内容unsigned char指针。指向成员函数的指针示例:

#include <iostream>#include <iomanip>struct foo { virtual void bar(){} };struct foo2 { };struct foo3 : 
foo2, foo { virtual void bar(){} };int main(){
    void (foo3::*p)() = &foo::bar;

    unsigned char const * first = reinterpret_cast<unsigned char *>(&p);
    unsigned char const * last = reinterpret_cast<unsigned char *>(&p + 1);

    for (; first != last; ++first)
    {
        std::cout << std::hex << std::setw(2) << std::setfill('0')
            << (int)*first << ' ';
    }
    std::cout << std::endl;}


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 1038 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信