什么是 qsort void*x 和 *(int*)x?
What's qsort void*x and *(int*)x?
有人可以解释
的工作-
*(int*)x;
-
const void *x
-
qsort(mass, 2*c, sizeof(int), sort)
-
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
仅表示"将x
从const 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
能够对任意数据类型进行分类(例如int
,double
,struct
引入的自定义数据类型,...(。由于它不了解数据类型及其大小,因此需要 - 除了元素数组和其中的元素数 - 另外两件事:(1(一个元素的大小,当算法需要交换两个元素时,需要(2(决定两个元素x
和y
的比较函数,无论是x>y
,x<y
还是x==y
。由于qsort
可以与任何数据类型一起使用,因此比较功能的签名将x
和y
作为数据类型void*
。
如果您的数组包含整数,则通过sizeof(int)
。比较函数需要比较整数,但它们被用作指针,即 void* x
;因此,您必须将其归还给int的指针,即 (int*)x
,然后将其放置以获取值(而不是指针(,即*(int*)x
。希望它有帮助。
请注意,在C 中,qsort
仅限于琐碎类型的对象:
25.5 C库功能
qsort:...除非数组中的对象,否则行为是不确定的 底部指向琐碎的类型。
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 不能使这种类型的"void(C::* volatile)(int) const "在参考手册C++示
- 如何使模板函数像 R f<void(int)>(args...)
- template<class T, int N> void h(T const(&)[N]); as friend function
- 函数 LNK2019 "int __cdecl __scrt_common_main_seh(void)" 中引用的未解析外部符号主错误 (?__scrt_common_main_seh@@YAHXZ
- 从不兼容的类型 'void (Button::*)(int)' 分配给'void (*)(int)'
- 错误 C2084:函数"int main(void)"已具有主体
- 编译Qt项目给出了对运算符delete(void*,unsigned int)的未定义引用
- int main(void) 在 C++ 中有效吗?
- sqlite3 更改函数回调参数 void* not用于 int* C++
- 什么是 qsort void*x 和 *(int*)x?
- 无法将参数 1 从"int (__thiscall A::* *)(void)"转换为"int (__cdecl *)(void)"
- 需要获取 void 或 int 的 Cpp 模板函子
- 为什么我可以将 void* static_cast 到 int* 而不是 int*&?
- 您如何通过函数的void指针将int值传递,然后将其转换回int值
- x = malloc(n * sizeof (int));无法将 void 转换为 int
- 错误:从"int (*)(std::list<myclass*>, int, char**, char**)"到"int (*)(void*, int, char**, char**)"的
- 如何在c++中将数组char复制到字符串或int*(void*)中