目录
![]()

qsort:对数组的元素进行排序



- struct stu
- {
- char name[20];//姓名
- int age;//年龄
- double grade;//成绩
- };
- int cmp_name(void* p1, void* p2)
- {
- //如果按照姓名排序
- return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
- }
- int cmp_age(void* p1, void* p2)
- {
- //如果按照年龄排序
- return ((int*)p1 - (int*)p2);
- }
- int cmp_grade(void* p1, void* p2)
- {
- //如果按照成绩排序
- return (int)((double*)p1 - (double*)p2);
- }
从 qsort 函数的形式,我们就不难看出 qsort 可以根据我们传入的 compar 函数来进行我们所需要的排序。
- struct stu
- {
- char name[20];//姓名
- int age;//年龄
- double grade;//成绩
- };
- int cmp_name(void* p1, void* p2)
- {
- //如果按照姓名排序
- return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
- }
- int cmp_age(void* p1, void* p2)
- {
- //如果按照年龄排序
- return ((int*)p1 - (int*)p2);
- }
- int cmp_grade(void* p1, void* p2)
- {
- //如果按照成绩排序
- return (int)((double*)p1 - (double*)p2);
- }
-
-
- int main()
- {
- struct stu s1 = { "zhangsan",14,89.5 };
- struct stu s2 = { "lisi",17,94.0 };
- struct stu s3 = { "wangwu",45,66.5 };
- struct stu arr[] = { s1,s2, s3 };
-
- int sz = sizeof(arr) / sizeof(arr[0]);
- qsort(arr, sz, sizeof(arr[0]), cmp_name);
- //需要排序的数组 //每个数组元素的大小
- //排序的数组中的元素数 排序所遵循的compar函数名
-
-
-
- return 0;
- }
从调试我们可以看出来,qsort 已经为数组排好序了。

void* 类型的指针 - 不能进行解引用操作符,也不能进行 + - 整数的操作
void* 类型的指针是用来存放任意类型数据的地址
void* 无具体类型的指针
可以用 void* 指针接收任何类型指针,如果需要解引用 void* 指针,可以强制类型转换。