在學習C語言語法時,學到一個函數指針。就是用指針指向一個函數(實質函數就是一個地址)。而後經過指針來調用該函數。當時學完以後一臉懵逼,不是不明白原理,而是不知道有什麼用?直接調用不就能夠了嗎?何須多費功夫去搞這些花裏胡哨的東西。函數
後面發現,這個函數指針也是有應用的場景的!學習
在我開發時,遇到這樣一個問題。ui
IIC協議既能夠用模擬也能夠用硬件自帶的。這樣就有一個問題,有些芯片我以爲硬件IIC並很差用,我想用模擬的。但這些切換就比較麻煩。全部IIC設備調用的函數都要修改一遍(C語言不支持同名函數)。這樣就比較麻煩了。用宏定義吧,就顯得代碼臃腫,每一個調用的地方都須要#if...#else...#endif。指針
這時,我想到了函數指針。我須要用模擬IIC時,就指向模擬IIC的函數。須要硬件IIC時,就指向硬件IIC的函數。這樣不就能夠了嗎?趕忙去試一下!code
typedef uint8_t (IIC_SEND)(uint8_t, uint8_t, uint8_t); typedef uint8_t (IIC_READ)(uint8_t, uint8_t, uint8_t); uint8_t Simulate_iic_send(uint8_t addr, uint8_t wbuffer, uint8_t length) { //模擬IIC發送時序 } uint8_t Hardware_iic_send(uint8_t addr, uint8_t wbuffer, uint8_t length) { //硬件IIC發送實現 } IIC_SEND fiic_send = Simulate_iic_send; IIC_SEND fiic_send = Hardware_iic_send;
這樣的話,我就能夠在初始化時,確認使用的是硬件IIC仍是模擬IIC。實際上能夠在運行中修改指針,切換不一樣模式(然而不必)。開發
延伸:或者咱們能夠吧IIC從機模式,IIC主機模式也作成這種方式。class