函数指针的作用

函数指针的作用函数指针的作用函数指针的作用有二:一是作为参数传递给另一个函数;二是转换表。1、函数指针作为参数传递给另一个函数回调函数:将一个函数指针作为参数传递给其它函数。后者将“回调”用户函数。实例:实现一个与类型无关的查找函数(单链表)思考:单链表的元素类型可能是字符串或者数组,数组和字符串无法作为参数传递给函数,但是指向他们的指针却可以。要求:需要查找函数作用于任何类型的值解决办法:把…

函数指针的作用

函数指针的作用有二:
一是作为参数传递给另一个函数;
二是转换表。

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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注