日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

c++ 函数指针_进化论——从函数指针到被结构封装的函数指针及参数的应用举例...

發(fā)布時(shí)間:2025/3/11 c/c++ 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ 函数指针_进化论——从函数指针到被结构封装的函数指针及参数的应用举例... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ?↑↑↑ 點(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。