c++ 函数指针_进化论——从函数指针到被结构封装的函数指针及参数的应用举例...
? ? ?↑↑↑ 點(diǎn)擊上方公眾號(hào)名稱關(guān)注,不放過(guò)任何轉(zhuǎn)變的機(jī)會(huì)。
??編 者 悟 語(yǔ)????????借口再小也會(huì)瓦解人的意志。
文 章 導(dǎo) 讀
????今天帶大家用下函數(shù)指針,然后將函數(shù)指針和函數(shù)參數(shù)封裝到結(jié)構(gòu)體中,接著將數(shù)據(jù)用動(dòng)態(tài)分配和靜態(tài)分配的方式賦值給相應(yīng)的函數(shù),從而實(shí)現(xiàn)比較靈活的函數(shù)封裝和調(diào)用的目的。
1函數(shù)指針#include #include //?圖省事,函數(shù)定義在main函數(shù)前了int TestFun1(int val1, int val2){ return (val1 + val2); }int TestFun2(int val1, int val2){ return (val1 - val2); }//?定義函數(shù)指針fun指向 int(*)(int,int)類型的函數(shù)int (*fun)(int val1, int val2); int main(int argc,char *argv[]){????//?指向要操作的函數(shù),并賦值參數(shù) fun = TestFun1; printf("testFun1 = %d\n",(*fun)(2,1)); fun = TestFun2; printf("testFun2 = %d\n",(*fun)(2,1));????}????運(yùn)行結(jié)果:
? ? ??
關(guān)于int (*fun)(int,int)需要說(shuō)明下,其為定義一個(gè)函數(shù)指針fun,它指向返回值為int,兩個(gè)參數(shù)類型都是int的函數(shù)。即fun指向的函數(shù)類型為 int(*)(int,int),也可以說(shuō)fun是int(*)(int,int)型的指針。2結(jié)構(gòu)封裝函數(shù)指針及參數(shù)????1)動(dòng)態(tài)分配方式調(diào)用
#include #include // 指針fun指向 int (*)(int , int )的函數(shù)typedef int (*fun)(int val1, int val2); //?定義封裝的函數(shù)及參數(shù)typedef struct{????int?val1;????int?val2;????fun?function; }TestStruct_t;int TestFun1(int val1, int val2){????return?(val1?+?val2);??}int TestFun2(int val1, int val2){ TestStruct_t t;???? // 調(diào)用函數(shù)TestFun1,與TestFun2參數(shù)交叉使用,實(shí)際中根據(jù)需要來(lái)????t.function?=?TestFun1; t.val1 = val1 + 1; t.val2 = (*(t.function))(t.val1, val2); // t.val1 + val2 = val1 + 1 + val2 return (t.val2 - t.val1); // t.val2 - t.val1 = (val1 + 1 + val2) - (val1 + 1) = val2}//?定義testStruct_t類型的二維數(shù)組,動(dòng)態(tài)分配時(shí)沒(méi)用TestStruct_t testArray[2][3] ={????{3,??????2,?????TestFun1},??????{4,??????5,?????TestFun2}??????};int main(int argc,char *argv[]){ // 動(dòng)態(tài)分配空間????TestStruct_t?*pMap?=?malloc(sizeof(testStruct_t));????????// 給動(dòng)態(tài)分配的空間賦值 pMap->val1 = 4; pMap->val2 = 6; // TestFun2 處理結(jié)構(gòu)是獲得參數(shù)val2的值,只是為了演示沒(méi)有啥實(shí)際意義????pMap->function?=?TestFun2;?????????//?指定參數(shù)獲得指向函數(shù)的返回值?? printf("%d",(*(pMap->function))(pMap->val1, pMap->val2)); }????運(yùn)行結(jié)果:
? ? ??
TestFun2利用封裝的結(jié)構(gòu)體類型引入TestFun1函數(shù),利用結(jié)構(gòu)體分裝方便切換函數(shù)。????2)靜態(tài)分配方式調(diào)用
#include #include // fun 指向 int (*)(int , int )typedef int (*fun)(int val1, int val2); //?定義封裝的函數(shù)及參數(shù)typedef struct{ int val1; int val2; fun function; }TestStruct_t;int TestFun1(int val1, int val2){ return (val1 + val2); }int TestFun2(int val1, int val2){????TestStruct_t?t; // 調(diào)用函數(shù)TestFun1,與TestFun2參數(shù)交叉使用,實(shí)際中根據(jù)需要來(lái) t.function = TestFun1; t.val1 = val1 + 1; t.val2 = (*(t.function))(t.val1, val2); // t.val1 + val2 = val1 + 1 + val2 return (t.val2 - t.val1); // t.val2 - t.val1 = (val1 + 1 + val2) - (val1 + 1) = val2}TestStruct_t testArray[2][3] ={????{3,??????2,??????TestFun1},??????{4,??????5,??????TestFun2}??????};int main(int argc,char *argv[]){ TestStruct_t *pMap; //利用數(shù)組的靜態(tài)空間即可,不用動(dòng)態(tài)分配了 // testStruct_t *pMap = malloc(sizeof(testStruct_t)); pMap = testArray[1]; //將數(shù)組第二行的首地址賦給testStruct_t類型的指針pMap// 用數(shù)組中的值賦值,不用下面的賦值了 /* pMap->val1 = 4; pMap->val2 = 6; pMap->function = TestFun2;*/ printf("\nThe value of TestFun2 is:%d\n",(*(pMap->function))(pMap->val1, pMap->val2)); }????運(yùn)行結(jié)果:
? ? ??
可以看出,在此實(shí)例中動(dòng)態(tài)分配與靜態(tài)分配主要差別在內(nèi)存分配方式和賦值形式上。總結(jié)
? ? 總的來(lái)說(shuō),不封裝的函數(shù)指針調(diào)用函數(shù)還是比較清晰的,但做比較大的項(xiàng)目的時(shí)候有時(shí)需要靈活的將函數(shù)及參數(shù)封裝起來(lái),一是方便管理,二是運(yùn)用靈活。
推薦文章:
宏分類的妙用(排版開(kāi)始用模板)
用Dev-C++生成dll動(dòng)態(tài)鏈接庫(kù)文件并用C代碼調(diào)用
指定常量、變量、函數(shù)在存儲(chǔ)空間的地址
功能多樣的預(yù)處理指令#pragma
printf與#和##的魔幻組合
掃碼關(guān)注我們
?Game Over! 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的c++ 函数指针_进化论——从函数指针到被结构封装的函数指针及参数的应用举例...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 保存图像_06 - matplotlib
- 下一篇: 对于一个指针可以多次使用delete_【