【实战篇】函数指针与指针函数的应用
ID:技术让梦想更伟大
整理:李肖遥



// 通过函数指针调用函数范例程序
1     #include<stdio.h>
2     int add(int a, int b) 
3     {
4            printf("addition function\n"); 
5            return a + b;
6     }
7
8     int sub(int a, int b)
9     {
10          printf("subtration function\n"); 
11          return a - b; 
12   }
13
14   int main(void)
15   {
16          int (*pf)(int, int);
17
18          pf = add; 
19          printf("addition result:%d\n", pf(5, 8));
20          pf = sub;
21          printf("subtration result:%d\n", pf(8, 5));
22          return 0;
23   } 

//求最大值函数(指针作为函数的返回值)
1     #include<stdio.h>
2     int *max(int *p1, int *p2)
3     {
4            if(*p1 > *p2)
5                   return p1;
6            else
7                   return p2; 
8     }
9
10   int main(int argc, char *argv[])
11   { 
12          int *p, a, b;
13          a = 1;  b = 2;
14          p = max(&a, &b);
15          printf("%d\n", *p);
16          return 0;
17   }

typedef int (*PF)(int, int);
有了这个类型,那么上述函数的声明就变得简单多了。即:
PF ff(int);
下面将以程序清单 2.3为例,说明用函数指针作为函数返回值的用法。当用户分别输入d、x和p时,求数组的最大值、最小值和平均值。
//求最值与平均值范例程序
1     #include<stdio.h>
2     #include <assert.h>
3     double getMin(double *dbData, int iSize)             // 求最小值
4     {
5            double dbMin; 
6
7            assert((dbData != NULL) && (iSize > 0));
8            dbMin = dbData[0]; 
9            for (int i = 1; i < iSize; i++){ 
10                 if (dbMin > dbData[i]){
11                        dbMin = dbData[i];
12                 }
13          }
14          return dbMin;
15   }
16
17   double getMax(double *dbData, int iSize)                // 求最大值
18   {
19          double dbMax;
20
21          assert((dbData != NULL) && (iSize > 0)); 
22          dbMax = dbData[0]; 
23          for (int i = 1; i < iSize; i++){
24                 if (dbMax < dbData[i]){ 
25                        dbMax = dbData[i];
26                 }
27          }
28          return dbMax;
29   }
30
31   double getAverage(double *dbData, int iSize)          // 求平均值
32   {
33          double dbSum = 0;
34
35          assert((dbData != NULL) && (iSize > 0)); 
36          for (int i = 0; i < iSize; i++){
37                 dbSum += dbData[i]; 
38          }
39          return dbSum/iSize;
40   } 
41
42   double unKnown(double *dbData, int iSize)            // 未知算法
43   { 
44          return 0;
45   }
46
47   typede double (*PF)(double *dbData, int iSize);          // 定义函数指针类型
48   PF getOperation(char c)                                   // 根据字符得到操作类型,返回函数指针
49   {
50          switch (c){ 
51          case 'd':
52                 return getMax; 
53          case 'x': 
54                 return getMin; 
55          case 'p': 
56                 return getAverage;
57          default:
58                 return unKnown;       
59          }
60   } 
61
62   int main(void) 
63   {
64          double dbData[] = {3.1415926, 1.4142, -0.5, 999, -313, 365}; 
65          int iSize = sizeof(dbData) / sizeof(dbData[0]); 
66          char c; 
67
68          printf("Please input the Operation :\n");
69          c = getchar(); 
70          PF pf = getOperation(c);
71          printf("result is %lf\n", pf(dbData, iSize));
72          return 0;
73   }
前4个函数分别实现了求最大值、最小值、平均值和未知算法,getOperation()根据输入字符得到的返回值是以函数指针的形式返回的,从pf(dbData, iSize)可以看出是通过这个指针调用函数的。注意,指针函数可以返回新的内存地址、全局变量的地址和静态变量的地址,但不能返回局部变量的地址,因为函数结束后,在函数内部的声明的局部变量的声明周期已经结束,内存将自动放弃。显然,在主调函数中访问这个指针所指向的数据,将会产生不可预料的结果。
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
扫描下方微信,加作者微信进技术交流群,请先自我介绍喔。
推荐阅读: 
嵌入式编程专辑 Linux 学习专辑 C/C++编程专辑 Qt进阶学习专辑 关注微信公众号『技术让梦想更伟大』,后台回复“m”查看更多内容。 长按前往图中包含的公众号关注
评论

