int cmp_int(const void* e1, const void* e2) { return *(int*)e1 - *(int*)e2; }为什么这样是从小到大排
时间: 2023-07-23 14:10:43 浏览: 150
这个函数是一个用于比较两个整数的排序函数。它通过将void*指针转换为int*指针,然后通过解引用操作符*来获取指针所指向的整数值,进行比较。
比较的结果是通过计算第一个整数减去第二个整数得到的差值来确定的。如果结果为负数,则表示第一个整数小于第二个整数;如果结果为0,则表示两个整数相等;如果结果为正数,则表示第一个整数大于第二个整数。
因此,当e1指向的整数值小于e2指向的整数值时,返回的差值为负数,从而使得排序结果是从小到大排列。这是由于常见的排序算法通常按照升序(从小到大)排列元素。
如果你想要一个从大到小排列的排序函数,你可以将返回语句改为 `return *(int*)e2 - *(int*)e1;`。这样,当e1指向的整数值大于e2指向的整数值时,返回的差值为正数,从而使得排序结果是从大到小排列。
相关问题
int cmp_chars(const void* e1, const void* e2) { return strcmp((char*)e1, *(char*)e2); }为什么用的是const void*
使用const void*作为函数参数的原因是为了增加函数的通用性和灵活性。
首先,const关键字表示指针所指向的数据是只读的,即在函数内部不会修改指针所指向的数据。这样做可以提高代码的安全性,避免无意中修改了不应该被修改的数据。
其次,void*是一种通用指针类型,可以指向任何类型的数据。这意味着我们可以将任意类型的指针传递给该函数,而不需要为不同的数据类型编写多个函数。这种灵活性使得函数可以适用于不同的场景,提高了代码的重用性。
在具体实现中,我们可以通过类型转换将void*指针转换为相应的类型指针,以便在函数内部进行操作。在这个例子中,我们将const void*转换为char*和char**,并使用strcmp函数进行比较。
总而言之,使用const void*作为函数参数可以使函数更加通用和灵活,适用于各种不同类型的数据。
#include <stdlib.h> typedef struct stu { //char name; int age; float weight; double hight; }stu; int cmp_by_age(const void*e1, const void*e2) { return (int)(((stu*)e1)->weight - ((stu*)e2)->weight); } int main() { stu class1[3] = { {17,185.5,190.8}, {16,160.9,200.7}, {18,120.3,150.5} }; int sz = sizeof(class1) / sizeof(class1[0]); int i; qsort(class1, sz,sizeof(class1[0]), cmp_by_age); for (i = 0; i < 3; i++) { printf("%.1f\n", class1[i].weight); } return 0;
这段代码是使用C语言编写的,主要实现了一个结构体数组的排序功能。首先定义了一个名为`stu`的结构体,包含了学生的年龄(`age`)、体重(`weight`)和身高(`hight`)。然后定义了一个用于比较年龄的函数`cmp_by_age`,该函数通过比较学生的体重来确定大小关系。在`main`函数中创建了一个包含3个学生的数组`class1`并初始化数据。接下来,使用`qsort`函数对数组进行排序,排序规则使用了之前定义的比较函数`cmp_by_age`。最后,通过循环遍历数组并打印出每个学生的体重。
代码输出结果为:
```
120.3
160.9
185.5
```
这表示按照学生体重从小到大的顺序进行了排序。
阅读全文