再议指针---------函数回调(qsort函数原理)
我们是否能写一个这种函数:
能够对不论什么类型数据排序
不论什么人在使用该函数不须要改动该函数代码(即:用户能够不必看到函数源 码,仅仅会调用即可)
思考:
用户须要排序的数据的类型千变万化,可能是int型,也有可能是自己定义的结构体类型,各种类型的大小比較规则是不一样的,这样看来实现一个这样全能的排序函数似乎不可能。
但详细须要排序的类型应依照什么规则确定大小仅仅有使用该函数的用户最清楚,那我们可不能够把实现比較大小的功能交给用户来完毕了,到时候用户仅仅需告诉该函数比較规则(函数)在什么位置,这样排序函数不就能够知道数据大小的比較规则了嘛!排序功能也就能够实现了。
那详细应该如何实现这个函数呢?
我们知道函数是有地址的,仅仅要让用户把大小比較规则写到一个独立的函数中,然后把该函数的地址传给排序函数就能够了。
以下的compare变量就是用来接收用户定义的大小比較规则函数地址
//如果须要排序的数据放在了int型数组中
int sort(int* arr,int (* compare)(const void* a,const void* b))
{
int result = compare(arr,arr+1);//调用用户定义的大小比較函数得到谁大谁小 //.....详细排序过程省略...........//
}
用户仅仅须要写一个这种函数就能够了
int comp(const void* a,const void* b)
{
//先强制转换类型,此处如果须要比較的数据类型为int型,当然须要比較结构体 //大小时要先转换成相应的结构体类型,然后再依据结构体中某些变量确定谁大谁 //小
int* aa=(int*)a;
int * bb=(int*)b;
return *aa>*bb?1:-1;
}
然后用户调用
sort(arr,comp);就能够了//如果须要排序的数据放在了int型arr数组中
到如今为止,我们已经实现了这个全能的排序函数,事实上c++库中的qsort就是这样实现的,不光是c++,事实上java也有相似的实现方式,比方java中加入监听器时常常要传入一个对象,事实上是为了得到这个对象的引用,然后调用我们实现的对象中的方法(通过多态实现)(详细事例详见本博客排列组合java源码及jar包 http://blog.csdn.net/qingchunweiliang/article/details/26464479)
再议指针---------函数回调(qsort函数原理)的更多相关文章
- sort()函数与qsort()函数及其头文件
sort()函数与qsort()函数及其头文件 sort()函数是C++中的排序函数其头文件为:#include<algorithm>头文件: qsort()是C中的排序函数,其头文件为: ...
- Java 实现函数回调
在Java里没用委托(delegate)这方法,所以想要实现回调还是有些麻烦.(想了解C#如何实现?请查看:http://www.cnblogs.com/Martin_Q/p/4478494.html ...
- Javascript中的回调函数和匿名函数的回调
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Javascript中的回调函数和匿名函数的回调示例介绍
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- C语言之函数指针、回调函数的使用
一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...
- VC++的函数指针和回调函数 及友元函数
什么是函数指针 函数指针是指向函数的指针变量.也就是说,它是一个指针变量,而且该指针指向一个函数. 对于指针变量来说,它的值是它指向的变量的地址.举个例子:指针变量pi是指向一个整型变量i的指针,则变 ...
- Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数
1. 概述: 我们在前面用了很多的装饰器这个工具的方法.这个位置要系统的讲一下装饰器. 1.2 为什么需要装饰器. 装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额 ...
- 函数指针和qsort函数
1.函数指针的形式: 函数指针:int (*funcP) (int *a, int *b) 表示定义了一个funcP函数指针,指向了返回值为int类型,参数为int* 和int* 的函数 使用方式: ...
- 函数指针(pointer to function)——qsort函数应用实例
一,举例应用 在ACM比赛中常使用 stdlib.h 中自带的 qsort 函数,是教科书式的函数指针应用示范. #include <stdio.h> #include <stdli ...
随机推荐
- 关于HEXO安装失败的解决方法
目前国内npm源有问题:所以键入如下代码即可安装成功: npm install -g cnpm --registry=https://registry.npm.taobao.org cnpm inst ...
- jmeter--响应断言
背景 在测试过程中,我们需要对某个请求的结果进行判定. 比如我们搜索“你好”,请求发送成功,返回响应码也是200,但是并不能说明返回的响应就是对的,我们可能还需要判定响应结果包含“你好”.这个时候,我 ...
- HibernateCRUD基础框架(1)-实体类
HibernateCRUD基础框架包括3篇文章,主要讲述整个CRUD基础框架的思路. 第1篇:讲述最基本的实体类,这些实体类是对SQL语言中的一些概念的封装. 第2篇:在这些实体类的基础上,开发一个& ...
- C# 进程同步,通信
进程之间通讯的几种方法:常用的方法有:1.使用内存映射文件2.通过共享内存DLL共享内存3.使用SendMessage向另一进程发送WM_COPYDATA消息. 发送WM_COPYDATA消息 比 ...
- RMQ问题-ST方法
参考 http://blog.csdn.net/sdj222555/article/details/7875575 RMQ 就是 Range Minimum/Maximum Query 就是求区间最值 ...
- iproute2交叉编译
测试zynq+ramdisk平台时发现自带的busybox无法通过ip命令配置can接口,执行can配置命令 ip link set can0 type can bitrate 会出现以下报错: ip ...
- 杭电ACM1197——Specialized Four-Digit Numbers
题目的意思是从2992開始的四位数.每个四位数的10.12,16进制的数的每一位加起来都相等,就输出该数. 非常easy的一道题目. 以下的是AC的代码: #include <iostream& ...
- 29、从零写USB摄像头驱动之通过urb接受数据后上报数据是函数中fid的作用
原因分析如下: 视频数据是由一帧一帧数据组成,为了防止数据错乱,会给每一帧数据分配一个frameid,从第0帧开始,接着是第1帧,接着又是第0帧这样交错进行的,对usb摄像头来说每一帧数据来源于多个包 ...
- Linux system函数返回值
例: status = system("./test.sh"); 1.先统一两个说法: (1)system返回值:指调用system函数后的返回值,比如上例中status为syst ...
- 【29.42%】【POJ 1182】食物链
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64875 Accepted: 19085 Description 动物王国中有三 ...