初识指针5の学习笔记

目录

1>>前言

2>>qsort函数的实现

2.1>>什么时qsort函数?

2.2>>qsort函数的格式是什么?

2.3>>qsort函数的解析

2.4>>qsort函数的实现!

3>>结语


1>>前言

        今天我会继续分享一些我做的笔记,以及我对指针的理解, 后续会持续分享指针几天,毕竟指针的内容太多了,一天我也学不完,也分享不完,感谢大家理解,希望我的文章对大家有所帮助,谢谢!

2>>qsort函数的实现

2.1>>什么时qsort函数?

        qsort函数是一个排序函数,可以排序任意类型的数组,使用qsort需要包含头文件<stdlib.h>,这是我至今为止学的最难理解的知识点,希望大家有所准备,我们一起学习它!

2.2>>qsort函数的格式是什么?

        qsort(数组首元素地址,数组元素个数,数组每个元素的大小,int(*p)(const void* e1,const void* e2))

这里的e1和e2指的是数组的两两相邻元素!p是可以自己取名的函数指针!

2.3>>qsort函数的解析

        既然知道格式是qsort(数组首元素地址,数组元素个数,数组每个元素的大小,int(*p)(const void* e1,const void* e2))的,那么怎么实现排序的呢?其实是通过e1和e2的比较来实现的,如果e1比e2大,那么函数指针p则返回大于0的值,如果e1等于e2,那么函数指针p则返回一个等于0的值,如果e1小于e2,那么函数指针p则返回一个小于0的值。

多说无益,实践才是王道,我们来看看它是怎么实现的就理解啦!

2.4>>qsort函数的实现!

#include<stdio.h>
#include<stdlib.h>

int cmp(const void* e1,const void* e2)
{
	return *(int*)e1-*(int*)e2;
}
int main ()
{
	int arr[10]={1,4,3,2,7,6,5,10,9,8};
	int sz=sizeof(arr)/sizeof(arr[0]);	
	int i=0;
	for (i=0;i<sz;i++)
	{
		printf("%d ",arr[i]);
	}
	qsort(arr,sz,sizeof(arr[0]),cmp);
	printf("\n"); 
	for (i=0;i<sz;i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
 } 

我们写一个乱序的数组arr,sz记录arr内有多少个元素,先打印看看原来的数组,然后使用qsort函数进行排序,在之前我们讲到过在sizeof和&以外,数组名就是数组首元素地址,所以qsort第一个逗号内容就写arr,接着写元素个数sz,再接着写每个元素大小,使用sizeof计算任意一个元素的大小就好,接着到最最最最最重要的函数指针,将第四个逗号的内容写一个函数地址,用来传递

在这里实现接收,记住格式要一样,为什么要使用void*无类型指针呢,因为这样可以强制类型转换成我们需要的类型,在return返回值时,我们讲过如果e1比e2大,那么函数指针p则返回大于0的值,如果e1等于e2,那么函数指针p则返回一个等于0的值,如果e1小于e2,那么函数指针p则返回一个小于0的值。那么此时我们可以简化一下上面的内容,将强制类型转换后的e1解引用完减e2,这样如果e1大返回的就是大于0 的值,e1小就返回小于0 的值,相等就返回等于0 的值,这下就简单许多。

上面是整形数组的例子,一个肯定不能说明qsort函数的妙用,接下来是一个结构体类型的例子

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu
{
	char name[20];
	int age;
};
int cmp_age(const void* e1,const void* e2)
{
	return (*(struct Stu*)e1).age-(*(struct Stu*)e2).age;
}

int main ()
{
	struct Stu s[3]={{"zhangsan",20},{"lisi",28},{"wangwu",25}};
	int sz=sizeof(s)/sizeof(s[0]);	
	int i=0;
	for (i=0;i<sz;i++)
	{
		printf("%d ",s[i].age);
	}
	qsort(s,sz,sizeof(s[0]),cmp_age);
	printf("\n"); 
	for (i=0;i<sz;i++)
	{
		printf("%d ",s[i].age);
	}
	return 0;
 } 

结构体咱们以学生为模板,就含两个元素:姓名和年龄。过程大家都懂就不过多赘述了,需要注意的就是需要转变类型为struct Stu* 也就是结构体类型。

若要对姓名进行排序就要使用strcmp函数,来比较两个字符串:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu
{
	char name[20];
	int age;
};
int cmp_name(const void* e1,const void* e2)
{
	return strcmp((*(struct Stu*)e1).name,(*(struct Stu*)e2).name);
}

int main ()
{
	struct Stu s[3]={{"zhangsan",20},{"lisi",28},{"wangwu",25}};
	int sz=sizeof(s)/sizeof(s[0]);	
	int i=0;
	for (i=0;i<sz;i++)
	{
		printf("%s ",s[i].name);
	}
	qsort(s,sz,sizeof(s[0]),cmp_name);
	printf("\n"); 
	for (i=0;i<sz;i++)
	{
		printf("%s ",s[i].name);
	}
	return 0;
 }

strcmp比较也是一样的,如果字符串1比字符串2大,那么则返回大于0的值,如果字符串1等于字符串2,那么则返回一个等于0的值,如果字符串1小于字符串2,那么则返回一个小于0的值。

3>>结语

        今天的内容主要是围绕qsort排序函数展开的,大家如果感兴趣可以试着自己写一个能实现任意类型函数的排序,也就是自己写一个qsort。今天学习笔记和分享就到这里啦,谢谢观看!期待下篇与你的相见!

  • 28
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫の准大一

谢谢大佬,我会三连你的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值