第一种用法展示:(整形数组的qsort)
一,qsort函数的定义:
qsort 函数的定义:void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
使用其需要包含头文件:#include<stdlib.h>
// size_t是一种无符号整数类型。
qsort函数有四个参数:
第一个:void* base
指向要排序的数组的第一个对象的指针。
第二个:size_t num
由base指针指向的数组中的需要排序的元素的数量。
第三个:size_t size
数组中每个元素的字节大小。
第四个:int (*compar)(const void*,const void*)
指向一个比较两个元素的函数的指针(函数指针),这个函数将被qsort反复调用以比较两个元素,这个函数指针指向的函数,能够比较base指向数组中的两个元素。
注意:第四个参数是函数指针,它所指向的函数是由我们自己编写的,其作用在于实现排序中的比较功能,所以我们创建的这个函数的参数以及返回类型的格式要按照第四个参数来定义:
int (*compar)(const void*,const void*)。
二,返回类型:
< 0
:前者指向的元素在小于后者指向的元素。0
:两个元素大小相等。> 0
:前者指向的元素大于后者指向的元素。
三,重点解释:
1:第四个参数,因为我们自己创建的比较整形的函数是 cmp_int,所以我们的传参传的就是cmp_int,函数名就是函数地址,所以和qsort函数的定义中的第四个参数为函数指针刚刚匹配,正好用函数指针来接收函数的地址(函数名)。
2:对于void*的解释,身为函数本身,他并不知道使用者会给它传什么类型的指针变量,有可能是对整形数组进行排序,有可能是结构体数组,字符数组等等,所以我们采用的是用void*来接收,void*特点:
void* 的指针 - 无具体类型的指针。
void* 类型的指针可以接收任意类型的地址。
void*是不能直接解引用操作的也不能直接进行指针运算的。
3:对于const的解释:const可以防止指针所指向的内容被修改,我们只是作比较,并不想要数据被修改。
4:综上所述,所以我们要将void*强转为我们需要的指针类型,然后再解引用,才能得到我们所需要的数据。
结果展示:
第二种用法展示:(结构体数组中的年龄元素的qsort)
和整形比较的区别在于:我们自己创建比较大小函数的时候,强转类型为struct stu*,然后->或者解引用之后再用 "." 操作符。
结果展示:
第三种用法展示:(结构体数组中的名字元素的qsort)
和结构体数组中的年龄比较的区别在于:我们需要用到strcmp函数,
strcmp的返回值:(比较的字符所对应的ascll码值)
- 如果两个名字的第一个字谜是相同的,函数返回
0
。 - 如果第一个名字的第一个字符小于第二个名字的第一个字符,则函数返回一个负数。
- 如果第一个名字的第一个字符大于第二个名字的第一个字符,函数返回一个正数。
- 总的来说:strcmp函数提供了一个简单而直接的方式来比较两个C风格的字符串是否相等,或者确定它们的ascll码值。
这正好与qsort函数的返回值一致,并且可以达到我们的名字元素的排序要求。
结果展示:
ascll码值中:l<w<z。