函数指针史上最全的介绍
生活随笔
收集整理的這篇文章主要介紹了
函数指针史上最全的介绍
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
函數指針
一. 函數指針的概念
如果在程序中定義了一個函數,那么在編譯時系統就會為這個函數代碼分配一段存儲空間,這段存儲空間的首地址稱為這個函數的地址。而且函數名表示的就是這個地址。既然是地址我們就可以定義一個指針變量來存放,這個指針變量就叫作函數指針變量,簡稱函數指針。
函數指針的定義方式可以如下表示:
函數返回值類型 (* 指針變量名) (函數參數列表);int(*p)(int, int);那么這個指針 p 就可以指向形如:int add(int a, int b);int get_info(int board, int module); 這樣類型的指針,形如:p = add;p = get_info;我們進行對函數指針進行初始化的時候可以做如下操作:
首先定義一個指針變量。
將同類型的函數名賦值給它。
使用typedef定義函數指針
在工程上,為了提高開發效率和代碼可讀性的問題,通常會用typedef對函數指針進行轉定義
typdef 函數返回值類型 (*指針類型名) (函數參數列表);typedef uint32_t (*xxx_callback)(int cb_type);此時,通過typedef轉定義的為指針類型名,相當于數據結構,(從面相對象的角度來看可以稱為類) 可以用于新建(實例化一系列函數指針變量),形如:xxx_callback init_callback;xxx_callback move_callback;而此時根據實際不同業務模塊處理的不同,可以將實例化的函數指針變量賦值為不同模塊的函數。定義 uint32_t service_init_cb(int cb_type) { return 0; }賦值 init_callback = service_init_cb;使用 ret = init_callback(0);/* 實際代碼 */ typedef uint32_t (*xxx_callback)(int cb_type);uint32_t service_init_cb(int cb_type) { return cb_type; }int main() {/* 實例化函數指針 */xxx_callback init_callback;service_init_cb(3);init_callback = service_init_cb;init_callback(5); }函數指針作為函數入參
在工程上,函數指針作為入參,通常用于函數回調。
int add(int a, int b) {return a + b; }int sub(int a, int b) {return a - b; }int get_result(int a, int b, int (*math_cal)(int, int)) {return math_cal(a, b); }int main() {int res1, res2;res1 = get_result(3, 2, add);res2 = get_result(3, 2, sub);printf("add_res = %d, sub_res = %d\n", res1, res2); }存放函數指針的數組
函數返回值類型 (* 指針變量名[數組長度]) (函數參數列表);int (*math_cal[2])(int, int); math_cal[0] = add; math_cal[1] = sub; for (int i = 0; i < 2; i++) {printf("Math cal %d res = %d\n", i, math_cal[i](3, 2)); }動態申請( 還沒有研究,求指導)使用typedef的模式: 定義函數指針數據類,利用該數據類常規實例化一個函數數組。 typedef uint32_t (*xxx_callback)(); xxx_callback g_cb_list[10]; int g_len; uint32_t xxx_callback_register(xxx_callback callback) {if(!callback) {printf("call back not exist");return -1;}g_cb_list[g_len++] = callback;return 0; }總結
以上是生活随笔為你收集整理的函数指针史上最全的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 图片印章_php工具型代码之印章
- 下一篇: oracle昨日时间,。。今日,昨日,上