int f(float, float);
提问1:这个 f 是个什么东西?
解析:在C语言中,这是声明了一个形参数据类型为(float, float),返回值类型为int的 f 函数。
int *f(int, int);
提问2:这个 f 又是什么东西?
解析:在C语言中,这是声明了一个形参数据类型为(int, int),返回值类型为int型指针的 f 函数。
int (*f)(int, int);
提问3:这个 f 又是何方神圣?
解析:别急,先从第一个括号开始分析,可以得出 f 是个指针,又从第二个括号看出有函数调用,且返回值为int类型,在C语言中,这个 f 为一个指向形参为(int, int),返回值类型为int 的函数的指针,对,f 是一个指针,一个指向函数的指针。(函数也要存放在某个指定位置,也有地址)
int (*f[])(int, int);
提问4:这个 f 又是神马玩意?
解析:经过前面的分析,可以得出,在C语言中,这个 f 是一个数组,它的元素为形参(int, int),返回值类型为int的函数指针,是的,这个 f 数组里存了一堆函数指针。
2.在理解了函数指针的概念后,让我来运用实现一个简单的计算器,来看看有哪些妙用
1.先写一个简易计算器的接口(funcp.h)
/*
** 定义一个简单计算器的接口
*/
#include <stdio.h>
#include <string.h>
/*
** 计算两数之和
*/
double add(double *a, double *b);
/*
** 计算两数之差
*/
double sub(double *a, double *b);
/*
** 计算两数之积
*/
double mul(double *a, double *b);
/*
** 计算两数之商
*/
double div(double *a, double *b);
/*
** 返回字符在字符数组中的索引,有3个参数
** 参数1:oparr寻找的数组,
** 参数2:op为要找的字符
** 参数3:cmp为函数指针,指向某一函数,该函数为回调函数,
** 用来比较字符是否相等,我用的是strncmp函数
*/
int serchIndex(const char *oparr, const char *op,
int (*cmp)(const char *str1, const char *str2, size_t count));
2.再写一个具体函数实现的文件(funcp.c)
#include "funcp.h"
double add(double *a, double *b){
return (*a) + (*b);
}
double sub(double *a, double *b){
return (*a) - (*b);
}
double mul(double *a, double *b){
return (*a) * (*b);
}
double div(double *a, double *b){
return (*a) / (*b);
}
int serchIndex(const char *oparr, const char *op,
int (*cmp)(const char *str1, const char *str2, size_t count)){
int i = 0;
while((oparr + i) != NULL){
if(cmp(oparr + i, op, 1) == 0)
return i;
++i;
}
return 0;
}
3.最后写main.c文件实现简易计算器
#include "funcp.c"
int main(){
//定义第一操作数,操作符和第二操作数
double a, b;
char op;
//定义索引
int index;
//定义一个函数指针数组
double (*opfunc[])(double*, double*) = {add, sub, mul, div};
char oparr[] = "+-*/";
printf("请输入第一个数: ");
scanf("%lf", &a);
printf("请输入操作符(+-*/): ");
scanf("%s", &op);
printf("请输入第二个数: ");
scanf("%lf", &b);
//strncmp作为回调函数,回调函数会将返回值返回调用函数中,
//这是函数指针的妙用体现,在这里是实现比较两个字符串是否相等
//在编译时,C编译器会将函数名转换为一个函数指针
index = serchIndex(oparr, &op, strncmp);
//输出答案
//通过索引找到对应计算函数,这也是函数指针的妙用之一
//如果不用函数指针,可以通过switch分支选择对应函数
printf("\n结果: %.2lf", opfunc[index](&a, &b));
}
测试简例(控制台输出):
请输入第一个数: 3
请输入操作符(+-*/): *
请输入第二个数: 5
结果: 15.00