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