这来自我正在使用的“神奇”数组库.
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; }
原文地址:https://www.jb51.cc/c/116059.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。