zl程序教程

您现在的位置是:首页 >  其它

当前栏目

22深入理解C指针之---通过指针传递函数

深入 理解 通过 --- 指针 22
2023-09-11 14:22:23 时间

 一、通过指针传递函数与通过指针传递数据的本质是一样的,区别就是此时的数据是函数指针(函数的开始的地址)

    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 }

    可以看到,借助函数指针令函数调用更加灵活。