練習題答案:函數指針轉換

2020-12-14 騰訊網

練習題答案

在上一篇文章中,我們留下了一道課後練習題。

題目是:你需要預測下列代碼編譯後得到的彙編代碼進行分析。

這是我們的C++代碼:

編譯器會對上述代碼進行編譯,並生成類似如下的彙編代碼:

如果使用圖片來表示,則如下;

只是為了好玩而已,在這裡,我交換了Base1和Base2的順序。標準中沒有關於為基類分配存儲的順序的要求,因此,如果編譯器認為這樣做會更有效,則完全有權利將Base2放在首位。

指向類Derived的成員函數的指針希望this指針位於q處。因此,當我們有一個p時,除了原始函數指針想要進行的其他任何調整之外,我們還需要向其添加sizeof(Base3)以將其轉換為q。

這就是為什麼我們將sizeof(Base3)添加到現有調節器中以製作新的組合調節器的原因。

最後

Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,裡面有很多關於Windows的小知識,對於廣大Windows平臺開發者來說,確實十分有幫助。

本文來自:《Answer to exercise: Pointer to member function cast》

相關焦點

  • 成員函數指針的一些奇怪行為
    如果你只是使用單繼承,則指向成員函數的指針實際上是指向了這個函數的起始地址,因為在單繼承中,所有基類都共享了同一個this指針。我們看看下面的代碼:因為它們都使用了同一個this指針,一個指向基類成員函數的指針可以被當作是指向Derived2的成員函數指針來使用,不需要進行任何的轉換操作。
  • 高級指針話題-函數指針
    -《中國哲學史》前言函數指針是什麼?如何使用函數指針?函數指針到底有什麼大用?本文將一一介紹。如何理解函數指針如果有int *類型變量,它存儲的是int類型變量的地址;那麼對於函數指針來說,它存儲的就是函數的地址。函數也是有地址的,函數實際上由載入內存的一些指令組成,而指向函數的指針存儲了函數指令的起始地址。如此看來,函數指針並沒有什麼特別的。
  • 快速上手系列-C語言之指針篇(四)函數與指針
    二維數組名作函數的參數:二維數組名作為參數,行可以不寫出來,列必須寫出來,如:數組指針作形參,完全等價於二維數組的應用指向函數的指針(函數指針):一個函數在編譯時被分配一個入口地址,這個地址就稱為函數的指針,函數名代表函數的入口地址。
  • 建哥指針數學:函數題總是做錯?是你沒有真的「懂」
    (原標題:建哥指針數學:函數題總是做錯?還有對於函數的單調性和奇偶性,單調性的證明方法和奇偶性的判斷,這些都需要理解到位。2.常見函數的圖像要熟悉初中階段同學們學習過一次函數、反比例函數、二次函數,在初中階段對這些基本的函數圖像就要做到熟悉。高中階段會學三種新的函數,指數函數、對數函數、冪函數,建哥指針數學強調,在高中階段這三類函數的性質及圖像要做到瞭然於心。
  • C語言 | 指向指針的指針
    當然是每天都練習一道C語言題目!!作者閆小林白天搬磚,晚上做夢。我有故事,你有酒麼?例82:C語言用指向指針的指針的方法對n個整數排序並輸出;要求將排序單獨寫成一個函數;n個整數在主函數中輸入,最後在主函數中輸出。
  • ...一文弄懂「函數指針數組」,為什麼不直接調用函數,而是通過指針...
    「函數指針類型」既然把C語言中的指針看作是一種數據類型,那麼函數指針也就容易理解了,也不過是一種像 char 、int 一樣的數據類型而已。char 、int 作為C語言中的基礎數據類型,是允許用其定義數組的,那函數指針這種「數據類型」也可以定義數組嗎?
  • 高一數學:函數壓軸題練習(含答案),每道題都超過12分!
    函數是高中階段最難的知識點之一,而且每次考試的大題必有一道函數題,分數都不低於12分,如果得到了這12分,成績肯定蹭蹭蹭往上漲!學習函數的最終目的依舊是應用,所以單單記住教材中的函數知識點並不意味著能夠解答函數問題,只能代表打好了函數的基礎。因此,在理解和記憶函數知識點的前提下,高中生就需要重視對其進行應用了。
  • 指針指針
    ,函數中聲明了一個指針變量a,這個指針指向的就是傳進函數內a的地址。這裡我們順便提一嘴C語言的函數作用域。C語言函數作用域C語言的函數作用域使得函數內的聲明的變量的生命只會存在該函數內,離開了該函數即被銷毀,這個銷毀是從存儲空間上的銷毀,所以如果期待一個有著全局作用域的指針變量去保存函數內的聲明的變量地址是不理想的。
  • 讓你不再害怕指針——C指針詳解(經典,非常詳細)
    int p(int); //從P 處起,先與()結合,說明P 是一個函數,然後進入()裡分析,說明該函數有一個整型變量的參數,然後再與外面的int 結合,說明函數的返回值是一個整型數據Int (*p)(int); //從P 處開始,先與指針結合,說明P 是一個指針,然後與()結合,說明指針指向的是一個函數,然後再與()裡的int 結合,說明函數有一個int 型的參數,
  • C語言函數指針之回調函數
    如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。2 為什麼要用回調函數?
  • C:數組與指針,指針與 const
    數組與指針我們都知道一個指針是代表的一個地址,指針,顧名思義,指向一塊區域。那麼數組呢?數組並不是代表一堆變量,數組其實也是一種指針,指向一個地址,一般是指向數組的首地址,也就是 a [0] 的地址。a==&a[0] a 是一個指針,指向數組 a 的首地址。下面四種函數原型都是等價的,第一個參數均為一個地址(指針)。
  • 程式設計師編程C語言指針答疑:小心scanf函數給指針輸錯值
    1、「己他」概念和「星指組合」概念來解題這道C語言指針題看上去不是那麼馬上就能知道問題的,其實使用我提出的C語言指針「己他」概念和「星指組合」來解這道題是很簡單的。+「指針變量」的組合,這種組合的意思就是獲取指針變量的他值!
  • 八年級數學總複習,一次函數壓軸題,附手寫詳細答案
    一次函數壓軸題精選題目這上期期末考試壓軸題,大多是一次函數的綜合題目,要想攻克綜合壓軸題,除了有紮實的基礎,還必須掌握一些特別的技能。今天選了三道壓軸題,供你周末練習。初二數學一次函數壓軸題精選1壓軸題第一題,一次函數與矩形,考點有面積問題,待定係數法求表達式,動點和等腰三角形問題,尤其是動點等腰三角形問題,這道題比較典型,值得好好練一練。
  • C語言字符串處理函數之字符串轉換、查詢函數
    介紹完字符串整體操作函數,就該到字符串查詢函數和字符串轉換函數了,至於一些字符串轉換函數,如atoi(),atof(),strtod(),strtol(),tolower(),toupper()等,以後有時間再整理整理。
  • 詳解C++ 的隱式類型轉換與函數重載!
    精確匹配,包括以下情況:實參類型和形參類型相同實參從數組類型或函數類型轉換成對應的指針類型向實參添加頂層const或從實參中刪除頂層const2.通過const轉換實現的匹配3. 通過類型提升實現的匹配4. 通過算術類型轉換或指針轉換實現的匹配5.
  • 深入淺出剖析C語言函數指針與回調函數
    回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
  • 二次函數經典壓軸題整理,老師:中考數學必考,學霸備考練習題
    中考數學各地的壓軸題都比較傾向於二次函數,有些動點問題和面積最大最小值只要各位同學刷過二次函數,就知道有些題目還是有一定的「套路」,二次函數比較難的題型是它和其它圖形的結合類題目,好多同學私信我,找二次函數的練習題,今天為大家整理了一些,希望能幫助同學們
  • C語言的那些小秘密之函數指針
    我們經常會聽到這樣的說法,不懂得函數指針就不是真正的C語言高手。我們不管這句話對與否,但是它都從側面反應出了函數指針的重要性,所以我們還是有必要掌握對函數指針的使用。先來看看函數指針的定義吧。本文引用地址:http://www.eepw.com.cn/article/270442.htm  函數是由執行語句組成的指令序列或者代碼,這些代碼的有序集合根據其大小被分配到一定的內存空間中,這一片內存空間的起始地址就成為函數的地址,不同的函數有不同的函數地址,編譯器通過函數名來索引函數的入口地址,為了方便操作類型屬性相同的函數,c/c++引入了函數指針,函數指針就是指向代碼入口地址的指針
  • 深入淺出剖析C語言函數指針與回調函數(一)
    百度的權威解釋如下:回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
  • C語言指針詳解
    本節中提到了函數sizeof(),那麼我來問一問,sizeof(指針名稱)測出的究竟是指針自身類型的大小呢還是指針所指向的類型的大小?答案是前者。答案:ptr->a;ptr->b;ptr->c;又請問怎樣通過指針pstr來訪問ss的三個成員變量?答案:*pstr;//訪問了ss的成員a。*(pstr+1);//訪問了ss的成員b。*(pstr+2)//訪問了ss的成員c。