函数指针的经典应用

本文并不是将什么是指针函数,不过通过本文会令你对指针函数理解更深。
对于C++里面的排序函数qsort大家并不陌生。由于排序在计算机系统中的大量使用,各种程序设计语言都提供了相应的模板或泛型。因为排序只是一种顺序上面的变化,并不会影响数据本身。所以不关乎什么类型的数据排序,重要的是排序算法本身。快速排序的平均效率较高。适合大部分的排序情况。在这里,将通过讲解qsort函数来学习指针函数的使用。
函数原型:void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *))
参数:
base:指向void类型的指针。其实是指向待排序数组的首地址。
nelem:待排序数组元素的个数。
width:每个元素所占存储空间的大小,多少个字节?多用sizeof来计算。
fcmp:用于对数组元素进行比较的函数指针。重点就在这里。

分析:
1.fcmp是一个函数指针,指向一个比较函数compare,compare函数是由我们自己来实现,告诉qsort什么是“先”什么是“后”,或者叫什么是“大”什么是“小”,由于排序总是基于量元素比较的基础上的。你通过实现compare比较函数告诉qsort哪个放在前,哪个放在后。那么qsort就会按照你的指示来完成排序。
2.由于fcmp被声明为int (*fcmp)(const void *,const void *)。所以我们在定义比较函数为fcmp赋值时就要遵照这一参数规则。举个例子:
int compare(const void *str1, const void *str2){
	char *s1 = (char*)str1;
	char *s2 = (char*)str2;
	if(*s1 < *s2)
		return -1;
	else if(*s1 > *s2)
		return 1;
	return 0;
}

 (1)返回值为-1,表示第一个参数“小于”第二个参数,或者说第一个要排在第二个前面。 

(2)返回值为1,表示第一个参数“大于”第二个参数,或者说第一个要排在第二个后面。
(3)返回值为0.表相等。
所以如果你需要降序,应该知道怎么改吧?

3.总结一下,其实就是在调用qsort为其排序的时候,可以告诉qsort如何决定两个元素的先后顺序,就是利用函数指针这一手法。这也就是传说中的回调!相当于我们去饭店吃饭,本来是我们调用饭店做菜即可,但是,我们还要做的就是给人家把菜单写好,人家才可以执行做菜。这种手法应用非常普遍的。当面向对象程序设计产生以后,这个问题就很容易解决了。

举个例子,对字符串数组排序

#include<iostream> #include<cstring> #include<algorithm> using namespace std; int strcmp(const void *str1, const void *str2){ char *s1 = (char*)str1; char *s2 = (char*)str2; for(s1, s2; *s1 != '\0' && *s2 != '\0'; s1++, s2++){ if(*s1 < *s2){ return -1; }else if(*s2 < *s1){ return 1; } } if(strlen(s1) < strlen(s2)){ return -1; }else if(strlen(s2) < strlen(s1)){ return 1; } return 0; } int main(){ // freopen("test.txt", "r", stdin); int n = 0; while(cin >> n){ char str[25][101]; int i = 0; for(i = 0; i < n; i++){ cin >> str[i]; } qsort(str, n, sizeof(char) * 101, strcmp); for(i = 0; i < n; i++){ cout << str[i] << endl; } } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值