函数指针的作用
函数指针的作用有二:
一是作为参数传递给另一个函数;
二是转换表。
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;
}
测试中可以使用我的另一个博客: “C++使用数组构造链表” 来实现 链表的构造和显示。
测试结果:
字符串为链表元素:未完待续…
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;
}
今天的文章函数指针的作用分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/25274.html