微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这个C语法是什么意思?

这来自我正在使用的“神奇”数组库.
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 举报,一经查实,本站将立刻删除。

相关推荐