本帖最后由 KBTiller 于 2011-05-11 19:35 编辑
我对回调函数以及函数回调有一些不理解?能给些少许解释么?
whyliyi 发表于 2011-05-11 09:37 ![]()
抄一段《狂人C》的内容,希望能对您理解“回调”有所帮助
如表14-7所示,这两个函数最有趣的就是它们的函数原型。 表14-7 查找与排序 函数名 | 用途 | void qsort(void *base, size_t nmemb, size_t size , int (*compar)(const void *, const void *)); | 排序 | void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); | 查找 | qsort()的前三个参数“void *base, size_t nmemb, size_t size,”实际上是在向函数传递一个数组。由于编写这个函数的人并不知道你要传递一个什么样的数组,所以没有办法把形参写成一个指向数组起始元素的指针类型以及数组元素个数这样的形式。他只能把你传过去的指向数组起始元素的指针作为“void *”类型来接收。 这样,问题出现了:他不清楚数组元素的类型。因此他又补了一个“size_t size”来了解数组元素所占据的空间。 这个函数的编写者同样不清楚你要求他按照升序还是降序来对数组排序。所以他又增加了一个传递这种比较两个元素“大”、“小”或先后次序的“比较准则”的参数。这个参数是以指向函数的指针形式出现的。这很有趣,对于这个参数,从某种意义上来说,“哥传过去的不是‘数据’,是‘动作’”。 不仅如此,这个“动作”的定义也是由你指定的。很多情况下你需要亲自定义这个函数。哪怕你只是要求qsort()做一个最简单的int类型元素数组的递增排序,你也得自己定义一个这样的函数: int bidaxiao(const void *p_zs1, const void *p_zs2) { return *(int *) p_zs1 - * (int *) p_zs2 ; } 其中的“(int *)”表示你知道p_zs1和p_zs2其实是由两个指向“int”数据的指针转换来的。 这样,更有趣的事情出现了,qsort()必须借助你定义的函数才能完成工作。在你调用了它之后,它总是要回来调用你定义的函数。这就是所谓的“回调”(Call-Back)
|