这来自我正在使用的“神奇”数组库.
void sort(magic_list *l,int (*compare)(const void **a,const void **b)) { qsort(l->list,l->num_used,sizeof(void*),(int (*)(const void *,const void *))compare); }
我的问题是:究竟什么是qsort做的最后一个论点?
(int (*)(const void *,const void*))compare)
qsort将int(* comp_fn)(const void *,const void *)作为比较器参数,但此sort函数采用带双指针的比较器.不知何故,上面的行将双指针版本转换为单指针版本.有人可以解释一下吗?
解决方法
在大多数硬件上,您可以假设指针在硬件级别看起来都相同.例如,在具有平坦64位寻址指针的系统中,指针总是64位整数.指向指针的指针或指向指针指针的指针也是如此.
因此,无论使用哪种方法来调用具有两个指针的函数,都可以使用任何带有两个指针的函数.指针的特定类型无关紧要.
qsort一般地处理指针,好像每个都是不透明的.所以它不知道或不关心它们如何被解除引用.它知道它们当前处于什么顺序,并使用compare参数来确定它们应该处于什么顺序.
您正在使用的库可能会保留指向指针的列表.它有一个比较函数,可以比较两个指针指针.因此它将其转换为传递给qsort.它在语法上比例如更好.
qsort(l->list,compare); /* elsewhere */ int compare(const void *ptr1,const void *ptr2) { // these are really pointers to pointers,so cast them across const void **real_ptr1 = (const void **)ptr1; const void **real_ptr2 = (const void **)ptr2; // do whatever with real_ptr1 and 2 here,e.g. return (*real_ptr2)->sort_key - (*real_ptr1)->sort_key; }