22深入理解C指针之---通过指针传递函数
一、通过指针传递函数与通过指针传递数据的本质是一样的,区别就是此时的数据是函数指针(函数的开始的地址)
1、定义:通过函数指针将函数传入函数;通过函数返回函数指针实现函数返回函数的目标
2、特征:
1)、通过函数指针的介入,使函数调用变得更加灵活,实现功能的封装性
2)、使真正的函数下沉一层,有利于函数功能的抽象
3)、是函数的交互变得更加自然与方便
3、函数指针:
1)、定义:与普通函数的定义基本类似,包括函数类型、函数名称和函数参数;形如 int (*guoCal)(int, int);
2)、特征:唯一的区别就是在函数名称前加上*,并使用()将*和函数名称包括起来;
3)、说明:上述定义的是返回类型为int ,函数参数为两个int类型的函数的指针;
4)、应用:若存在上述定义,存在函数int add(int, int), int sub(int, int), 则可以有guoCal = add; guoCal = sub等语句
代码如下:
1)、通过函数指针使函数返回函数:
1 #include <stdio.h> 2 3 int add(int var1, int var2){ 4 return var1 + var2; 5 } 6 7 int sub(int var1, int var2){ 8 return var1 - var2; 9 } 10 11 int mul(int var1, int var2){ 12 return var1 * var2; 13 } 14 15 int div(int var1, int var2){ 16 return var1 / var2; 17 } 18 19 int mod(int var1, int var2){ 20 return var1 % var2; 21 } 22 23 void inputVar(int *var1, int *var2){ 24 printf("Please input var1: "); 25 scanf("%d", var1); 26 27 printf("Please input var2: "); 28 scanf("%d", var2); 29 30 return; 31 } 32 33 typedef int (*ptrCal)(int, int); 34 35 ptrCal resultCal(char *ch){ 36 ptrCal cal1; 37 printf("Please input ch: "); 38 scanf("%c", ch); 39 40 switch(*ch){ 41 case '+': 42 cal1 = add; 43 break; 44 45 case '-': 46 cal1 = sub; 47 break; 48 49 case '*': 50 cal1 = mul; 51 break; 52 53 case '/': 54 cal1 = div; 55 break; 56 57 case '%': 58 cal1 = mod; 59 break; 60 61 default: 62 printf("you can select:+ - * / %!\n"); 63 } 64 65 return cal1; 66 } 67 68 int main(int argc, char **argv) 69 { 70 ptrCal cal2; 71 int var1; 72 int var2; 73 char ch; 74 inputVar(&var1, &var2); 75 getchar(); 76 cal2 = resultCal(&ch); 77 printf("The %d %c %d = %d\n", var1, ch, var2, cal2(var1, var2)); 78 79 return 0; 80 }
2)、通过将函数指针作为函数的参数:
1 #include <stdio.h> 2 3 int add(int var1, int var2){ 4 return var1 + var2; 5 } 6 7 int sub(int var1, int var2){ 8 return var1 - var2; 9 } 10 11 int mul(int var1, int var2){ 12 return var1 * var2; 13 } 14 15 int div(int var1, int var2){ 16 return var1 / var2; 17 } 18 19 int mod(int var1, int var2){ 20 return var1 % var2; 21 } 22 23 void inputVar(int *var1, int *var2){ 24 printf("Please input var1: "); 25 scanf("%d", var1); 26 27 printf("Please input var2: "); 28 scanf("%d", var2); 29 30 return; 31 } 32 33 typedef int (*ptrCal)(int, int); 34 35 int resultCal(ptrCal cal, int var1, int var2){ 36 return cal(var1, var2); 37 } 38 39 int main(int argc, char **argv) 40 { 41 int var1; 42 int var2; 43 inputVar(&var1, &var2); 44 printf("The %d + %d = %d\n", var1, var2, resultCal(add, var1, var2)); 45 printf("The %d - %d = %d\n", var1, var2, resultCal(sub, var1, var2)); 46 printf("The %d * %d = %d\n", var1, var2, resultCal(mul, var1, var2)); 47 printf("The %d / %d = %d\n", var1, var2, resultCal(div, var1, var2)); 48 printf("The %d %% %d = %d\n", var1, var2, resultCal(mod, var1, var2)); 49 50 return 0; 51 }
可以看到,借助函数指针令函数调用更加灵活。
人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。