什麼是函式指標

以函式位址為值的指標。像 int (*fp)(int, int) = add; 這樣,連同引數與回傳值的型別一起宣告,以 fp(1, 2) 或 (*fp)(1, 2) 呼叫所指向的函式。使用函式指標的陣列,可以建立依編號切換處理的表。用於像傳入排序比較函式的 qsort 這種回呼、中斷向量表、狀態機中各狀態的處理等。在機器碼中,會成為把位址放入暫存器再跳躍的間接呼叫。

日文名稱: 関数ポインタ

「函式指標」出現在2領域的3道練習題中(指令集與組合語言, C語言基礎等)。

這個名詞所屬的領域: C語言基礎

練習函式指標的題目

使用C語言函式指標的呼叫「(*fp)(x)」,在RISC-V中一般是以下列哪個指令進行?

  1. A將函式的位址放入暫存器,以jalr跳到該暫存器的位址
  2. B在jal中以立即值寫入函式的位址後跳躍
  3. C以beq與函式的位址比較,相等就跳躍
查看答案與解析

正確答案:A. 將函式的位址放入暫存器,以jalr跳到該暫存器的位址

函式指標所指的目的地到執行時才會知道,所以無法使用把目的地寫在指令中的jal。因此,將指標的值載入暫存器,像「jalr ra, 0(t0)」這樣跳到暫存器的位址,返回位址則留在ra。C++的虛擬函式或共用函式庫中函式的呼叫,也是類似的間接呼叫。由於目的地會變動,CPU會以間接分支預測器來預測目的地。

解析中的「函式指標」

出現「函式指標」的題目(3題)

  1. 使用C語言函式指標的呼叫「(*fp)(x)」,在RISC-V中一般是以下列哪個指令進行?
  2. 執行上方使用函式指標陣列的程式時的輸出,下列何者正確?
  3. RISC-V的虛擬指令「ret」,實際上是以下列哪一個指令執行的?

相關名詞

返回位址 共享函式庫(Shared library) 分支預測 陣列 指標(pointer) 虛擬指令(Pseudo-instruction) 巨集(macro) 未定義行為 位元欄位(bit-field) 前置處理器

前往名詞解釋列表