函数指针(回调函数)代码例子

2017-07-06  本文已影响9人  yikemi
1       #include<stdio.h>
2       #include <assert.h>
3       double GetMin(double *dbData, int iSize)               // 求最小值
4       {
5           double dbMin;
6           int i;
7      
8           assert(iSize>0);
9           dbMin=dbData[0];
10          for (i=1; i<iSize; i++){
11                if (dbMin>dbData[i]) {
12                     dbMin=dbData[i];
13                }
14          }
15          return dbMin;
16     }
17
18     double GetMax(double *dbData, int iSize)               // 求最大值
19     {
20         double dbMax;
21         int i;
22
23         assert(iSize>0);
24         dbMax=dbData[0];
25         for (i=1; i<iSize; i++){
26             if (dbMax< dbData[i]) {
27                 dbMax=dbData[i];
28             }
29         }
30         return dbMax;
31     }
32
33     double GetAverage(double *dbData, int iSize)            // 求平均值
34     {
35         double dbSum=0;
36         int i;
37    
38         assert(iSize>0);
39         for (i=0; i<iSize; i++)
40         {
41              dbSum+=dbData[i];
42         }
43         return dbSum/iSize;
44     }
45
46     double UnKnown(double *dbData, int iSize)             // 未知算法
47     {
48         return 0;
49     }
50
51     typedef double (*PF)(double *dbData, int iSize);     // 定义函数指针类型
52     PF GetOperation(char c)                              // 根据字符得到操作类型,返回函数指针
53     {
54         switch (c)
55         {
56           case 'd':
57                     return GetMax;//返回函数名相当于返回一个指针名
58           case 'x':
59                     return GetMin;
60           case 'p':
61                     return GetAverage;
62           default:
63                     return UnKnown;
64           }
65     }
66
67     int main(void)
68     {
69          double dbData[]={3.1415926, 1.4142, -0.5,999, -313, 365};
70          int iSize=sizeof(dbData)/sizeof(dbData[0]);
71          char c;
72
73          printf("Please input the Operation :\n");
74          c=getchar();
75          printf("result is %lf\n", GetOperation(c)(dbData,iSize));   // 通过函数指针调用函数
76    }

上述程序中前面4个函数分别实现求最大值、最小值、平均值和未知算法,然后实现了GetOperation函数。这个函数根据字符的返回值实现上面4个函数。它是以函数指针的形式返回的,从后面的main函数的GetOperation(c)(dbData, iSize)可以看出,通过这个指针可以调用函数。

返回函数名相当于返回一个指针名。返回值的类型匹配。
函数名本身是一个指针类型。函数指针

如果定义:
int* func()与int *p

有如下的关系:

func   《====》p
func() 《====》*p
上一篇 下一篇

猜你喜欢

热点阅读