天天看點

C 函數指針 函數指針數組 轉移表

内容來自《c和指針》,整理後友善個人了解

cdel程式可以友善的給出聲明的釋義

f is pointer to function returning int

第2個括号是函數調用操作符。第1個括号起到聚組的作用,迫使間接通路在函數調用之前進行,使f成為一個函數指針。f指向的函數傳回一個整型值。

g is pointer to function returning pointer to int

和上面的大緻相同,差別在于g指向的函數傳回一個指向整型指針

為了進一步了解“迫使間接通路在…之前進行”,再舉例說明

abc is pointer to array 0…5 of int

先對括号内的*abc求值:迫使間接通路在建立數組之前進行,使abc成為一個指針,abc指向一個數組,數組元素類型是int

f is array 0…9 of pointer to int
f is array of pointer to function returning int

先對*f[]求值:f是數組,元素類型是某種類型的指針

末尾的()是函數調用操作符

f的元素類型是函數指針,指向的函數的傳回值是整型

作為參數傳遞給另一個函數

callback function

概念:把一個函數指針作為參數傳遞給其他函數,後者将回調使用者的函數。

應用場合:

函數需要在不同時刻執行不同類型的工作

執行隻能由函數調用者定義的工作

下面這個例子就是用函數指針實作的可以自定義類型的排序函數sort

如果switch操作符的代碼是從0開始連續的整數,可以用一個轉移表來完成switch語句完成的任務

C 函數指針 函數指針數組 轉移表

如果不是從0開始的連續整數,這種情況更合适switch語句。

因為在通路轉移表之前,還需要一系列操作把操作符轉換為合适的下标。

在轉移表,越界通路是十分危險的,測試很難發現bug究竟在哪裡,一開始就應該保證轉移表使用的下标位于合法的範圍内

使用轉移表時應添加注釋,以彌補轉移表的可讀性缺陷

c