gpt4 book ai didi

c - qsort() 和转换操作

转载 作者:行者123 更新时间:2023-12-01 16:19:03 27 4
gpt4 key购买 nike

考虑一个结构指针数组。以下代码取自您可能会找到的示例 here 。我想要为这两排铸件进行移植。我对这种“双重类型转换”不熟悉。

int myptrstructcmp(const void *p1, const void *p2)
{
struct mystruct *sp1 = *(struct mystruct * const *)p1;
struct mystruct *sp2 = *(struct mystruct * const *)p2;

我认为应该是:

int myptrstructcmp(const void *p1, const void *p2)
{
struct mystruct *sp1 = (struct mystruct *)p1;
struct mystruct *sp2 = (struct mystruct *)p2;

最佳答案

假设您正在对 int 的数组进行排序。您的比较器将传递一对 int *伪装成void * ;添加了一层间接。

如果您要对 struct mystruct * 的数组进行排序,你的比较器通过了 struct mystruct **伪装成void * ;添加了一层间接。

What is the meaning of struct mystruct * const *? Without the const* it fails to cast correctly. Why?

“没有 const *”是什么意思?它无法正确转换'?没有 const ,工作正常。没有第二个* ,它不起作用,因为该函数传递了 struct mystruct ** (给予或采取一些常量)如果你省略了第二颗星,你就滥用了类型系统。

考虑:

struct mystruct
{
int i;
};

int myptrstructcmp(const void *p1, const void *p2);
int myptrstructcmp(const void *p1, const void *p2)
{
struct mystruct *sp1 = *(struct mystruct **)p1;
struct mystruct *sp2 = *(struct mystruct **)p2;

if (sp1->i < sp2->i)
return -1;
else if (sp1->i > sp2->i)
return +1;
else
return 0;
}

这编译得很好。当您添加 const 时,它也可以正常编译。 **之间。就我个人而言,我不会包含 const在类型转换中。我要做的就是 const 限定 sp1sp2指针:

    struct mystruct const *sp1 = *(struct mystruct **)p1;
struct mystruct const *sp2 = *(struct mystruct **)p2;

或者:

    const struct mystruct *sp1 = *(struct mystruct **)p1;
const struct mystruct *sp2 = *(struct mystruct **)p2;

这保证不会修改它们在函数中指向的对象,这实际上对于qsort()的正确性能至关重要。 .

关于c - qsort() 和转换操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29987869/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com