上次看Atmel的示例工程,發現人家使用了函數指針的結構體(函數指針結構體)。感嘆人家的C語言功夫審覈,本身費勁仍是隻能讀懂的份。不過,函數指針確實好用。今天就試試這個超牛的東西。Now let's see how function pointers can help us.html
實驗前,瞭解下函數指針的定義方法。(來自百度百科的說明)數組
函數指針的聲明方法爲: 函數
函數類型 (標誌符指針變量名) (形參列表); ui
注1:「函數類型」說明函數的返回類型,「(標誌符指針變量名 )」中的括號不能省,若省略總體則成爲一個函數說明,說明了一個返回的數據類型是指針的函數,後面的「形參列表」表示指針變量指向的函數所帶的參數列表。例如: url
int func(int x); /* 聲明一個函數 */ spa
void (*f) (int x); /* 聲明一個函數指針 */ 指針
f=func; /* 將func函數的首地址賦給指針f */ code
賦值時函數func不帶括號,也不帶參數,因爲func表明函數的首地址,所以通過賦值之後,指針f就指向函數func(x)的代碼的首地址。 htm
注2:函數括號中的形參無關緊要,視狀況而定。blog
第二步,準備實驗環境。
MDK473+STM32F4.其實沒有必要在開發板中試,只是恰好我手上有這麼個開發環境,就不去配置別的東西了。
第三步,開始寫代碼:
一、寫兩個功能不一樣參數類型同樣的函數。
這裏我寫了兩個函數:
uint8_t max1(uint8_t x,uint8_t y) { return x>y?x:y; } uint8_t max2(uint8_t x,uint8_t y) { if(x>y) return x; else return y; }
兩個函數同樣的功能。
二、一個函數指針,映射其中的一個函數 看輸出。以後映射到第二個函數看輸出
實現步驟
int main(void) { mymax = &max1; mymax(3,5); mymax = &max2; mymax(4,6); while (1) { } }
以後但不跟蹤進去看看,會發現兩個max函數都執行了。
還有一種是將函數指針弄成一個數組的形式。數組的成員都是函數指針。這種寫法特別適合作接口程序。好比我先前博客裏邊提到的Atmel的(函數指針結構體)。底層函數和上層函數分開來的效果,是當底層硬件改變以後,只寫相應的接口函數就能夠掛在到原來的大程序中。比從新寫要簡單不少。
如下是函數指針數組的實驗:
繼續使用上邊的兩個max函數。由於函數的返回類型是相同的,因此能夠定義成數組。定義的時候只須要注意書寫的格式就好了:
int main(void) { uint8_t (*myFun[2])(uint8_t,uint8_t);myFun[0] = max1; myFun[1] = max2; myFun[0](2,4); myFun[1](5,2); }
運行下,能夠看到兩個max依此都執行了。
其實函數名就是個指針,指向了函數的入口地址。函數的參數什麼的,是函數名後邊的一段空間,能夠有也能夠沒有。跟這個指針沒什麼必然聯繫。