欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

函数指针的作用

程序员文章站 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
请按任意键继续. . .
*/
相关标签: 函数指针