qingcheng奕  

就是指向函数的指针。

回调函数,表示了一个函数的地址,将函数作为参数进行使用。参考百度百科:http://baike.baidu.com/view/414773.htm

常用的大概就是在sort函数中了吧。

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

例子如下:

函数:typedef int (__stdcall *CompareFunction)(constbyte*,constbyte*)

使用者:void  DLLDIR __stdcall  Bubblesort(byte* array,int size,int elem_size,CompareFunction cmpFunc);
使用者:void  DLLDIR __stdcall  Quicksort(byte* array,int size,int elem_size,CompareFunction cmpFunc);
void DLLDIR __stdcall Bubblesort(byte* array,int size,int elem_size,CompareFunction cmpFunc)
{
    for(int i=0; i < size; i++)
    {
        for(int j=0; j < size-i-1; j++)
        {
            //回调比较函数
            if(1 == (*cmpFunc)(array+j*elem_size,array+(j+1)*elem_size))
            {
                //两个相比较的元素相交换
                byte* temp = new byte[elem_size];
                memcpy(temp,array+j*elem_size,elem_size);
                memcpy(array+j*elem_size,array+(j+1)*elem_size,elem_size);
                memcpy(array+(j+1)*elem_size,temp,elem_size);
                delete [] temp;
            }
        }
    }
}
对编写者来说,不必介意函数在何处实现,或它怎样被实现的,所需在意的只是两个用于比较的元素的地址,并返回以下的某个值(库的编写者和使用者都必须遵守这个约定):
·-1:如果第一个元素较小,那它在已排序好的数组中,应该排在第二个元素前面。
·0:如果两个元素相等,那么它们的相对位置并不重要,在已排序好的数组中,谁在前面都无所谓。
·1:如果第一个元素较大,那在已排序好的数组中,它应该排第二个元素后面。
int __stdcall CompareInts(const byte* velem1,const byte* velem2)
{
    int elem1 = *(int*)velem1;
    int elem2 = *(int*)velem2;
    if( elem1 < elem2 )
        return -1;
    if(elem1 > elem2)
        return 1;
    return 0;
}
int __stdcall CompareStrings( const byte* velem1, const byte* velem2 )
{
    const char* elem1 = (char*)velem1;
    const char* elem2 = (char*)velem2;
    return strcmp(elem1,elem2);
}

应用:

Bubblesort((byte*)array,5,sizeof(array[0]),&CompareInts);

Quicksort((byte*)str,5,10,&CompareStrings);

posted on 2013-11-25 20:10  qingcheng奕  阅读(619)  评论(0编辑  收藏  举报