↑↑↑ 点击上方公众号名称关注,不放过任何转变的机会。
借口再小也会瓦解人的意志。
文 章 导 读
今天带大家用下函数指针,然后将函数指针和函数参数封装到结构体中,接着将数据用动态分配和静态分配的方式赋值给相应的函数,从而实现比较灵活的函数封装和调用的目的。
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)); }
运行结果:
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)); }
运行结果:
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与#和##的魔幻组合
扫码关注我们
