函数指针的作用

本文探讨了函数指针在C/C++中的两大应用:作为参数传递给其他函数的回调机制,以及作为转换表实现状态转移。通过实例,如单链表查找函数和数学运算的动态选择,展示了函数指针如何提升代码的灵活性和复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数指针的作用

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

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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值