void qsort(void * base,size_num,size_size,int(*cmp)(const void*,const void*));
这个函数中分为四个部分;
1,base中存放的是待排序目标数据中的第一个对象的地址
2.size_num指的是目标数组元素的个数
3,size_size指的是目标数组中一个元素的大小
//值得注意的是qsort函数使用的是void类型,在这2,3两者的作用下,我们即使没有告诉计算机数据类型,他依然能很好的找到数组中每一个元素
4,int (*cmp)(const void*,const void*) (cmp是compare的缩写)
此部分我们要告诉计算机让数组根据什么进行比较,详细如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
char name[20];
int age;
};
void print(struct student ps[], int sz)
{
int i;
for (i = 0; i < sz; i++) {
printf("%s,%d", ps[i].name, ps[i].age);
}
}
int sort_by_age(const void* e1, const void* e2)
{
return ((struct student*)e1)->age - ((struct student*)e2)->age;
}
//int test1()
//{
// int sz;
// struct student s[3] = { {"zhuangsan",34},{"lisi",30},{"wangwu",28} };
// sz = sizeof(s[3]) / sizeof(s[0]);
// qsort(s, 3, sizeof(s[0]), sort_by_name);
// print(s[3], sz);
//}
int main()
{
int sz;
struct student s[3] = { {"zhuangsan",34},{"lisi",30},{"wangwu",28} };
sz = sizeof(s) / sizeof(s[0]);
qsort(s, 3, sizeof(s[0]), sort_by_age);
print(s, sz);
}
再此期间出现了一个小的问题
此代码在打印的时候使用的是实数传参,我并不会使用指针传参
int test2()
{
int sz;
struct student s[3] = { {"zhuangsan",34},{"lisi",30},{"wangwu",28} };
sz = sizeof(s) / sizeof(s[0]);
qsort(s, 3, sizeof(s[0]), sort_by_age);
print(s, sz);
}
//int test1()
//{
// int sz;
// struct student s[3] = { {"zhuangsan",34},{"lisi",30},{"wangwu",28} };
// sz = sizeof(s[3]) / sizeof(s[0]);
// qsort(s, 3, sizeof(s[0]), sort_by_name);
// print(s[3], sz);
//}
int main()
{
test2();
}
当我将上述上代码中main函数的代码换成text函数时,虽然没有报错,但是程序并没有成功运行
提到一个strcmp的函数,此函数可以比较两个字符串首字符的Acall码值
void*a空指针不可以进行解引用的操作,也不可以加减任何数