函数指针的作用
程序员文章站
2024-03-07 16:15:45
...
函数指针的作用
函数指针的作用有二:
一是作为参数传递给另一个函数;
二是转换表。
1、函数指针作为参数传递给另一个函数
回调函数:将一个函数指针作为参数传递给其它函数。后者将“回调”用户函数。
实例:实现一个与类型无关的查找函数(单链表)
思考:单链表的元素类型可能是字符串或者数组,数组和字符串无法作为参数传递给函数,但是指向他们的指针却可以。
要求:需要查找函数作用于任何类型的值
解决办法:把参数类型声明为 void * , 表示“一个指向未知类型的指针”。
回调函数如下:
int compare(void const *a, void const *b){
if ( *(int *)a == *(int *)b )return 0;//相等,返回0
else return 1;//1:表示 a>b
}
单链表查找函数如下:
// 回调函数(比较函数)的完整的原型声明: int(*compare)(void const *, void const *))
Node *search_list(Node *node, void const *value, int(*compare)(void const *, void const *)){
while (node != NULL){
if ( compare( &node->value, value) == 0) break;// 调用回调函数compare()
node = node->next;
}
return node;
}
未完待续…
2、函数指针作为转换表
包括两步:
step1:声明状态转移函数、声明并初始化函数指针数组
step2:调用 函数指针数组
(1)声明状态转移函数、声明并初始化函数指针数组
(1.1)声明 状态转移函数
double add(double, double);
double sub(double, double);
double mul(double, double);
double div(double, double);
double xiebianchang(double, double);
(1.2)声明并初始化一个函数指针数组
pfunc:数组
数组元素:函数指针
返回值:double型数据
double(*pfunc[])(double, double) = { add, sub, mul, div, xiebianchang };//5个转移状态
(2)调用 函数指针数组
double result= pfunc[i](a,b);
// i:表示 add(0),sub(1),mul(2),div(3),xiebianchang(4);
// a:形参1,b:形参2
测试代码:
#include<iostream>
#include<cmath>
using namespace std;
// 转换表
// 转换表 step1:
//(1.1)声明 转台转移函数
double add(double, double);
double sub(double, double);
double mul(double, double);
double div(double, double);
double xiebianchang(double, double);
//(1.2)声明并初始化一个函数指针数组 pfunc:数组 数组元素:函数指针 返回值:double型数据
double(*pfunc[])(double, double) = { add, sub, mul, div, xiebianchang };//5个转移状态
//状态转移函数的实现
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; }
double xiebianchang(double a, double b){ return sqrt(pow(a, 2) + pow(b, 2)); }
void test(){
//转换表 step2:调用 函数指针数组
int n = sizeof(pfunc) / sizeof(pfunc[0]);//转移表中 包含的元素个数(状态转移函数个数)
for (int i = 0; i < n; ++i){
cout << pfunc[i](3, 4) << endl;
}
}
int main(){
test();
return 0;
}
/*
结果:
7
-1
12
0.75
5
请按任意键继续. . .
*/
上一篇: 详解在springmvc中解决FastJson循环引用的问题
下一篇: 2.3复合类型---指针