1.   
  2.   我们是否能写一个这种函数:
  3.   能够对不论什么类型数据排序
  4.   不论什么人在使用该函数不须要改动该函数代码(即:用户能够不必看到函数源 码,仅仅会调用即可)
  5.   思考:
  6.   用户须要排序的数据的类型千变万化,可能是int型,也有可能是自己定义的结构体类型,各种类型的大小比較规则是不一样的,这样看来实现一个这样全能的排序函数似乎不可能。
  7.   但详细须要排序的类型应依照什么规则确定大小仅仅有使用该函数的用户最清楚,那我们可不能够把实现比較大小的功能交给用户来完毕了,到时候用户仅仅需告诉该函数比較规则(函数)在什么位置,这样排序函数不就能够知道数据大小的比較规则了嘛!排序功能也就能够实现了。
  8.   
  9.   
  10.   
  11.   那详细应该如何实现这个函数呢?
  12.   我们知道函数是有地址的,仅仅要让用户把大小比較规则写到一个独立的函数中,然后把该函数的地址传给排序函数就能够了。
  13.   
  14.   以下的compare变量就是用来接收用户定义的大小比較规则函数地址
  15.   //如果须要排序的数据放在了int型数组中
  16.   int sort(int* arr,int (* compare)(const void* a,const void* b))
  17.   {
  18. int result = compare(arr,arr+1);//调用用户定义的大小比較函数得到谁大谁小
  19.  
  20.   //.....详细排序过程省略...........//
  21.   }
  22.   
  23.   用户仅仅须要写一个这种函数就能够了
  24.   int comp(const void* a,const void* b)
  25.   {
  26.   //先强制转换类型,此处如果须要比較的数据类型为int型,当然须要比較结构体 //大小时要先转换成相应的结构体类型,然后再依据结构体中某些变量确定谁大谁 //小
  27.    int* aa=(int*)a;
  28.    int * bb=(int*)b;
  29.    return *aa>*bb?1:-1;
  30.   }
  31.   
  32.   
  33.   然后用户调用
  34.   sort(arr,comp);就能够了//如果须要排序的数据放在了int型arr数组中
  35.   
  36.   到如今为止,我们已经实现了这个全能的排序函数,事实上c++库中的qsort就是这样实现的,不光是c++,事实上java也有相似的实现方式,比方java中加入监听器时常常要传入一个对象,事实上是为了得到这个对象的引用,然后调用我们实现的对象中的方法(通过多态实现)(详细事例详见本博客排列组合java源码及jar http://blog.csdn.net/qingchunweiliang/article/details/26464479)
  37.   

再议指针---------函数回调(qsort函数原理)的更多相关文章

  1. sort()函数与qsort()函数及其头文件

    sort()函数与qsort()函数及其头文件 sort()函数是C++中的排序函数其头文件为:#include<algorithm>头文件: qsort()是C中的排序函数,其头文件为: ...

  2. Java 实现函数回调

    在Java里没用委托(delegate)这方法,所以想要实现回调还是有些麻烦.(想了解C#如何实现?请查看:http://www.cnblogs.com/Martin_Q/p/4478494.html ...

  3. Javascript中的回调函数和匿名函数的回调

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. Javascript中的回调函数和匿名函数的回调示例介绍

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. C语言之函数指针、回调函数的使用

    一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...

  6. VC++的函数指针和回调函数 及友元函数

    什么是函数指针 函数指针是指向函数的指针变量.也就是说,它是一个指针变量,而且该指针指向一个函数. 对于指针变量来说,它的值是它指向的变量的地址.举个例子:指针变量pi是指向一个整型变量i的指针,则变 ...

  7. Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数

    1. 概述: 我们在前面用了很多的装饰器这个工具的方法.这个位置要系统的讲一下装饰器. 1.2 为什么需要装饰器. 装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额 ...

  8. 函数指针和qsort函数

    1.函数指针的形式: 函数指针:int (*funcP) (int *a, int *b) 表示定义了一个funcP函数指针,指向了返回值为int类型,参数为int* 和int* 的函数 使用方式: ...

  9. 函数指针(pointer to function)——qsort函数应用实例

    一,举例应用 在ACM比赛中常使用 stdlib.h 中自带的 qsort 函数,是教科书式的函数指针应用示范. #include <stdio.h> #include <stdli ...

随机推荐

  1. Webpack学习手册

    多端阅读<Webpack官方文档>: 在PC/MAC上查看:下载w3cschool客户端,进入客户端后通过搜索当前教程手册的名称并下载,就可以查看当前离线教程文档.下载Webpack官方文 ...

  2. ThreadPoolExecutor – Java Thread Pool Example(如何使用Executor框架创建一个线程池)

    Java thread pool manages the pool of worker threads, it contains a queue that keeps tasks waiting to ...

  3. jQuery----鼠标移动、点击案例

    单击隐藏: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  4. [Angular] Angular Global Keyboard Handling With EventManager

    If we want to add global event handler, we can use 'EventManager' from '@angular/platform-broswer'. ...

  5. swift项目第十天:网络请求工具类的封装

    import UIKit /* 必须先导入头文件:import AFNetworking */ import AFNetworking //MARK:-0:定义枚举:以枚举定义请求网络的get和pos ...

  6. IE9下不显示select

    由于IE8和IE9下不兼容,需要在头部加入: <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7&q ...

  7. LDR: LdrpWalkImportDescriptor() failed to probe C:\WINDOWS\system32\opencv_core243d.dll for its manifest, ntstatus 0xc0150002

    LDR: LdrpWalkImportDescriptor() failed to probe C:\WINDOWS\system32\opencv_core243d.dll for its mani ...

  8. [CSS] No selectable effect

    .noselect { -webkit-touch-callout: none; /* iOS Safari */ -webkit-user-select: none; /* Chrome/Safar ...

  9. iOS中拉伸图片的几种方式

    假如下面的一张图片,是用来做按钮的背景图片的,原始尺寸是(128 * 112) 按钮背景图片.png 我们通过代码将这张图片设置为按钮的背景图片,假如我们将创建好的按钮的宽高设置为:(W=200, H ...

  10. js进阶正则表达式5几个小实例(原样匹配的字符在正则中原样输出)(取反^)

    js进阶正则表达式5几个小实例(原样匹配的字符在正则中原样输出)(取反^) 一.总结 原样匹配的字符在正则中原样输出:var reg4=/第[1-2][0-9]章/g //10-29 取反^:var ...