亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何用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 關注
  • 1106 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號