什么是 qsort void*x 和 *(int*)x?

What's qsort void*x and *(int*)x?

本文关键字:int void 什么 qsort      更新时间:2023-10-16

有人可以解释

的工作
  1. *(int*)x;
  2. const void *x
  3. qsort(mass, 2*c, sizeof(int), sort)
  4. return i>0 ?i:(-1.0*i)

在此代码中:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int sortt(const void *x, const void *y)
{
    int e=*(int*)x;
    int e1=*(int*)y;
    if(e>e1)
       return 1;
    else
       return -1;
}
double abss(double i)
{
    return i>0 ?i:(-1.0*i);
}

int main()
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int n,m,i,t=1,sum;
    while(scanf("%d %d",&n,&m)==2)
    {
        double avg=0,balance=0;
        int a[15];
        sum=0;
        for(i=0; i<15; i++)
            a[i]=00000000;
        for(i=0; i<m; i++)
        {
            cin>>a[i];
            sum+=a[i];
        }
        avg=(double)sum/n;
        for(i=m; i<2*n; i++)
        {
            a[i]=0;
        }
        qsort(a,2*n,sizeof(int),sortt);
        printf("Set #%dn",t++);
        int first,last;
        for(i=0; i<n; i++)
        {
            first=a[i];
            last=a[2*n-i-1];
            if(first==0 && last !=0)
            {
                printf(" %d: %dn",i,last);
            }
            else if(first==0 && last==0)
            {
                printf(" %d:n",i);
            }
            else
            {
                printf(" %d: %d %dn",i,first,last);
            }
            balance+=abss(((double)first+(double)last)-avg);
        }
        printf("IMBALANCE = %0.5lfnn",balance);
    }
    return 0;
}

它是一个UVA OJ问题(410(解决这种排序样式和在排序功能中内置的CPP有什么区别在CppRefernce中阅读有关Qsort的信息,但不了解:(

qsort具有以下原型:

void qsort(
  void *base,
  size_t nel,
  size_t width,
  int (*compar)(const void *, const void *)
)

base是指向要排序的内存区域的指针(a(。nel是元素的数量(2 * c(,而width是每个元素的大小(sizeof (int)(。compar是指向该函数的指针,该函数应接受该区域中元素的两个指针,并返回第一个指针,是否小于( -1(,等于( 0(,还是大于( 1(第二。

qsort使用void指针,因为它旨在在任何类型上操作。因此,在比较器函数中,您必须 cast 您收到的const void*指针。*(int*)x仅表示"将xconst void *转换为int *,然后将其取消以获得int

比较器接受const void *指针,因为它不应该修改要排序的数组的内容。因此,*(const int *)x的样式会稍好一些,因为它保留了const- ness。

最后,return i > 0 ? i : -1.0 * i使用条件运算符?:,该操作员在语义上与if相同,但以表达式而不是语句的形式。它只是意味着:

if (i > 0)
  return i;
else
  return -1.0 * i;

C 中C和std::sort中的qsort之间的差异是C 排序保留静态类型信息,提高安全性,并且可以由编译器由编译器进行特定类型和比较器,从而通过避免间接函数调用。

在C中,qsort能够对任意数据类型进行分类(例如intdoublestruct引入的自定义数据类型,...(。由于它不了解数据类型及其大小,因此需要 - 除了元素数组和其中的元素数 - 另外两件事:(1(一个元素的大小,当算法需要交换两个元素时,需要(2(决定两个元素xy的比较函数,无论是x>yx<y还是x==y。由于qsort可以与任何数据类型一起使用,因此比较功能的签名将xy作为数据类型void*

如果您的数组包含整数,则通过sizeof(int)。比较函数需要比较整数,但它们被用作指针,即 void* x;因此,您必须将其归还给int的指针,即 (int*)x,然后将其放置以获取值(而不是指针(,即*(int*)x。希望它有帮助。

请注意,在C 中,qsort仅限于琐碎类型的对象:

25.5 C库功能

qsort:...除非数组中的对象,否则行为是不确定的 底部指向琐碎的类型。

相关文章: