1.指针函数的定义
2. 用函数指针作为函数的返回值
我们用上面介绍的方法分析一下,ff首先与后面的“()”结合,即:
也就意味着,ff是一个函数。
这种写法确实让人非常难懂,以至于一些初学者产生误解,认为写出别人看不懂的代码才能显示自己水平高。而事实上恰好相反,能否写出通俗易懂的代码是衡量程序员是否优秀的标准。一般来说,用typedef关键字会使该声明更简单易懂。在前面我们已经见过:
也就是说,PF是一个函数指针“变量”。当使用typedef声明后,则PF就成为了一个函数指针“类型”,即:
这样就定义了返回值的类型。然后,再用PF作为返回值来声明函数:
//程序清单 1 求最值与平均值示例
#include<stdio.h>
#include <assert.h>
double GetMin(double *dbData, int iSize) // 求最小值
{
double dbMin;
int i;
assert(iSize>0);
dbMin=dbData[0];
for (i=1; i<iSize; i++)
{
if (dbMin>dbData[i])
{
dbMin=dbData[i];
}
}
return dbMin;
}
double GetMax(double *dbData, int iSize) // 求最大值
{
double dbMax;
int i;
assert(iSize>0);
dbMax=dbData[0];
for (i=1; i<iSize; i++)
{
if (dbMax< dbData[i])
{
dbMax=dbData[i];
}
}
return dbMax;
}
double GetAverage(double *dbData, int iSize) // 求平均值
{
double dbSum=0;
int i;
assert(iSize>0);
for (i=0; i<iSize; i++)
{
dbSum+=dbData[i];
}
return dbSum/iSize;
}
double UnKnown(double *dbData, int iSize) // 未知算法
{
return 0;
}
typedef double (*PF)(double *dbData, int iSize); // 定义函数指针类型
PF GetOperation(char c) // 根据字符得到操作类型,返回函数指针
{
switch (c)
{
case 'd':
return GetMax;
case 'x':
return GetMin;
case 'p':
return GetAverage;
default:
return UnKnown;
}
}
int main(void)
{
double dbData[]={3.1415926, 1.4142, -0.5,999, -313, 365};
int iSize=sizeof(dbData)/sizeof(dbData[0]);
char c;
printf("Please input the Operation :\n");
c=getchar();
printf("result is %lf\n", GetOperation(c)(dbData,iSize)); // 通过函数指针调用函数
}
上述程序中前面4个函数分别实现求最大值、最小值、平均值和未知算法,然后实现了GetOperation函数。这个函数根据字符的返回值实现上面4个函数。它是以函数指针的形式返回的,从后面的main函数的GetOperation(c)(dbData, iSize)可以看出,通过这个指针可以调用函数。