C语言函数指针实验
上次看Atmel的示例工程,發現人家使用了函數指針的結構體(函數指針結構體)。感嘆人家的C語言功夫審核,自己費勁還是只能讀懂的份。不過,函數指針確實好用。今天就試試這個超牛的東西。Now let's see how function pointers can help us.
實驗前,了解下函數指針的定義方法。(來自百度百科的說明)
函數指針的聲明方法為:
函數類型 (標志符指針變量名) (形參列表);
注1:“函數類型”說明函數的返回類型,“(標志符指針變量名 )”中的括號不能省,若省略整體則成為一個函數說明,說明了一個返回的數據類型是指針的函數,后面的“形參列表”表示指針變量指向的函數所帶的參數列表。例如:
int func(int x); /* 聲明一個函數 */
void (*f) (int x); /* 聲明一個函數指針 */
f=func; /* 將func函數的首地址賦給指針f */
賦值時函數func不帶括號,也不帶參數,由于func代表函數的首地址,因此經過賦值以后,指針f就指向函數func(x)的代碼的首地址。
注2:函數括號中的形參可有可無,視情況而定。
第二步,準備實驗環境。
MDK473+STM32F4.其實沒有必要在開發板中試,只是剛好我手上有這么個開發環境,就不去配置別的東西了。
第三步,開始寫代碼:
1、寫兩個功能不同參數類型一樣的函數。
這里我寫了兩個函數:
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; }
兩個函數一樣的功能。
2、一個函數指針,映射其中的一個函數 看輸出。之后映射到第二個函數看輸出
實現步驟
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依此都執行了。
其實函數名就是個指針,指向了函數的入口地址。函數的參數什么的,是函數名后邊的一段空間,可以有也可以沒有。跟這個指針沒什么必然聯系。
總結
- 上一篇: 有关Android launchMode
- 下一篇: 2015北京区域赛 Mysteriou