void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*))这是标准库快速排序的函数请问为什(*compar)里有*号 为啥啊 int* com我理解是返回一个int型指针 然而快排的*号跟函数名有关 请问为啥啊
(*compar)代表的是一个返回值为int,参数表是(const void*,const void*)的一个函数,定义了函数指针后,它是未初始化的,一般还需要将这个函数指针指向另一个函数。
int (*compar)(const void*,const void*) 并不是指compare 是int ,而是 compare是一个函数指针
可以这样理解,*compare=f, int f(const void *,const void)是一个函数,compare是指向f的一个指针
这是一个函数指针。之所以需要函数指针的原因是,qsort要做到通用性,必须允许调用者去自定义排序的规则。
要自定义排序的规则,最好的办法,是qsort遇到两个元素的时候,通过传入的函数指针反过来调用调用者定义的比较函数。
*compar 这个就是函数指针类型, 你看到qsort内的代码,就有
if (compar(arr[x], arr[y])>0) ...
这样的代码
也就是把它当作函数使用。
qsort 的最后一个参数是个函数地址,函数的原型是int compar(const void*,const void*)这样的。插入参数时写成qsort( base, num, size, compar)。
然后qsort实现中,会调用compar函数进行执行。compar就是回调函数,函数作为参数时需要函数指针变量,也就是说指向函数地址的指针变量。int (*compar)(const void*,const void*))就是这个定义
推荐你去看《C程序设计语言》有中文和pdf,里面有讲解这个函数,大概在函数指针那一块。这是一个指向函数的指针,int (*compar)(const void*,const void*) compar相当于函数名,int是返回值,void 是指参数,这里有2个。使用这样的形式定义qsort,在qsort中的定义是这样
void qsort(void v[], int left, int right, int (*comp)(void *,void *))
{
int i, last;
void swap(int v[], int i, int j);
if (left >= right) / do nothing if array contains /
return; / fewer than two elements /
swap(v, left, (left + right)/2); / move partition elem = =*/
last = left; /* to v[0] /
for (i = left + 1; i <= right; i++) / partition */
if ((*comp)(v[i], v[left] ) < 0){
swap(v, ++last, i);
}
swap(v, left, last); /* restore partition elem */
for(int i = 0;i < 6; i++)
printf(" %d", v[i]);
printf("\n");
qsort(v, left, last-1);
qsort(v, last+1, right);
}
然后实际调用的时候,qsrot((void**)lineptr, 0 ,line -1, (int (*)(void*,void*))(isnum ? numcmp: strcmp));
这里的numcmp和strcmp的定义是 int numcmp(char*s, char *t) 和nt strcmp(char *s, char *t)
void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));
int (*compar)(const void*,const void*)这个参数是函数指针,指向一个参数为(void* , void*)返回类型为int的函数。
快排是基于回调函数的,你已经先去理解回调函数。