P120P122指针的进阶(回调函数中qsort函数的使用,自己写一个qsort函数?)#C语言的学习

文章讲述了C语言中使用qsort函数对结构体数组进行排序的方法,重点在于理解void指针以及自定义比较函数sort_by_age。结构体包含姓名和年龄字段,通过qsort函数和比较函数实现按照年龄升序排列。示例代码中展示了如何定义和调用qsort以及打印排序后结果的过程。
摘要由CSDN通过智能技术生成

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空指针不可以进行解引用的操作,也不可以加减任何数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值