函数指针史上最全的介绍
生活随笔
收集整理的這篇文章主要介紹了
函数指针史上最全的介绍
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
函數(shù)指針
一. 函數(shù)指針的概念
如果在程序中定義了一個(gè)函數(shù),那么在編譯時(shí)系統(tǒng)就會(huì)為這個(gè)函數(shù)代碼分配一段存儲(chǔ)空間,這段存儲(chǔ)空間的首地址稱為這個(gè)函數(shù)的地址。而且函數(shù)名表示的就是這個(gè)地址。既然是地址我們就可以定義一個(gè)指針變量來(lái)存放,這個(gè)指針變量就叫作函數(shù)指針變量,簡(jiǎn)稱函數(shù)指針。
函數(shù)指針的定義方式可以如下表示:
函數(shù)返回值類型 (* 指針變量名) (函數(shù)參數(shù)列表);int(*p)(int, int);那么這個(gè)指針 p 就可以指向形如:int add(int a, int b);int get_info(int board, int module); 這樣類型的指針,形如:p = add;p = get_info;我們進(jìn)行對(duì)函數(shù)指針進(jìn)行初始化的時(shí)候可以做如下操作:
首先定義一個(gè)指針變量。
將同類型的函數(shù)名賦值給它。
使用typedef定義函數(shù)指針
在工程上,為了提高開發(fā)效率和代碼可讀性的問(wèn)題,通常會(huì)用typedef對(duì)函數(shù)指針進(jìn)行轉(zhuǎn)定義
typdef 函數(shù)返回值類型 (*指針類型名) (函數(shù)參數(shù)列表);typedef uint32_t (*xxx_callback)(int cb_type);此時(shí),通過(guò)typedef轉(zhuǎn)定義的為指針類型名,相當(dāng)于數(shù)據(jù)結(jié)構(gòu),(從面相對(duì)象的角度來(lái)看可以稱為類) 可以用于新建(實(shí)例化一系列函數(shù)指針變量),形如:xxx_callback init_callback;xxx_callback move_callback;而此時(shí)根據(jù)實(shí)際不同業(yè)務(wù)模塊處理的不同,可以將實(shí)例化的函數(shù)指針變量賦值為不同模塊的函數(shù)。定義 uint32_t service_init_cb(int cb_type) { return 0; }賦值 init_callback = service_init_cb;使用 ret = init_callback(0);/* 實(shí)際代碼 */ typedef uint32_t (*xxx_callback)(int cb_type);uint32_t service_init_cb(int cb_type) { return cb_type; }int main() {/* 實(shí)例化函數(shù)指針 */xxx_callback init_callback;service_init_cb(3);init_callback = service_init_cb;init_callback(5); }函數(shù)指針作為函數(shù)入?yún)?/h3>
在工程上,函數(shù)指針作為入?yún)?#xff0c;通常用于函數(shù)回調(diào)。
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); }存放函數(shù)指針的數(shù)組
函數(shù)返回值類型 (* 指針變量名[數(shù)組長(zhǎng)度]) (函數(shù)參數(shù)列表);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)); }動(dòng)態(tài)申請(qǐng)( 還沒有研究,求指導(dǎo))使用typedef的模式: 定義函數(shù)指針數(shù)據(jù)類,利用該數(shù)據(jù)類常規(guī)實(shí)例化一個(gè)函數(shù)數(shù)組。 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; }總結(jié)
以上是生活随笔為你收集整理的函数指针史上最全的介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php 图片印章_php工具型代码之印章
- 下一篇: vue 时区转换_vue---时间戳转换