參考:http://www.cnblogs.com/CBDoctor/archive/2012/10/15/2725219.html
背景:以前看別人的代碼,總是會看到函數指針的用法。(當時感覺,好高打上,代碼移植性真好!絕必技術大拿呀!)
今天:工作任務很多,但是不想做(嘿嘿,偷懶一會吧,畢竟今天周五,哈哈...),整理一下函數指針的用法吧。
溫馨提醒:讀者千萬不要着急,從頭到尾認真的看一遍,保證可以搞懂(針對新手,或者模糊的人,高手可以噴噴)。
1. 首先看看通常調用函數的例子
#include <stdio.h> void MyFun(int x); //此處也可以寫成 void MyFun(int); int main(void) { MyFun(10); return 0; } void Myfun(int x) { printf("%d\n",x); }
這個MyFun函數是一個無返回值的函數,他並不完成什么事情。As we all know的用法。
我們一開始只是從功能上或者說從數學意義上理解MyFun這個函數,知道MyFun函數名代表的是一個功能(或是說一段代碼)。
直到————>注意到函數指針概念時,不得不在思考:函數名到底又是什么東西?
(不要以為這沒有什么意義的事噢!呵呵... 繼續看你就知道了。)
2. 函數指針變量的申明
As we all know 數據變量的內存地址可以存儲在相應的指針變量中,函數的首地址也可以存儲在某個函數指針變量里的。這樣我就可以通過這個函數指針變量來調用所指向的函數了。
在C系列語言中,任何一個變量,總是要先申明,之后才能使用。那么函數指針變量也應該要先申明吧?那又是如何來申明的呢?以上面例子為例,我來申明一個可以指向MyFun函數的函數指針變量FunP。下面就是申明FunP變量的方法:
void (*FunP)(int); //也可以寫成void (*FunP)(int x);
你看,整個函數指針變量如同函數MyFun的申明處一樣,只不過——我們把MyFun改成(*FunP)而已,這樣就有了一個能指向MyFun函數的指針FunP了。(當然,這個FunP指針變量也可以指向所有其他具有相同參數及返回值的函數。)
沒有代碼,都是文字,累死寶寶了...
3. 通過函數指針變量調用函數
有了FunP指針變量后,我們就可以對它賦值指向MyFun,然后通過FunP來調用MyFun函數了。看我如何通過FunP指針變量來調用MyFun函數的:
1 #include <stdio.h> 2 3 int main(void) 4 { 5 6 return; 7 }
回調函數:在一處聲明和調用,在其他地方實現的這樣一個函數稱為回調函數
一般回調函數的用法為:
甲方進行結構體的定義(成員中包括回調函數的指針)
乙方定義結構體變量,並向甲方注冊,
甲方收集N個乙方的注冊形成結構體鏈表,在某個特定時刻遍歷鏈表,進行回調。
當 函數指針 作為函數的參數,傳遞給一個被調用函數,被調用函數就可以通過這個指針調用外部的函數,這就形成了回調
一般的程序調用函數作用不是非常明顯,可以不使用這種形式
最主要的用途就是當函數不處在同一個文件中,比如動態庫,要調用其他程序中的函數就只有采用回調的形式
通過函數指針參數將外部函數地址傳入來實現調用
函數的代碼做了修改,也不必改動庫的代碼,就可以正常實現調用便於程序的維護和升級。