初识指针5の学习笔记

news2024/11/30 12:43:19

目录

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。今天学习笔记和分享就到这里啦,谢谢观看!期待下篇与你的相见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2059633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型基础学习知识,看这一篇就够了

​ 学习路线&#xff1a;感性认识现象->理解本质和原理->将所学知识用于解释新现象并指导实践。 ​ LLM训练模型的的三个阶段&#xff1a; 1、Pre-train 2、Supervised Fine-Tuning&#xff1a;Instruction Fine-tuning 3、RLHF - > RLAIF&#xff1a;增强式学习…

Internet Download Manager(下载工具)中文授权版

IDM是一款windows平台下的下载工具。 软件截图&#xff1a; 使用说明&#xff1a; 解压后&#xff0c;双击start_IDM.bat来运行软件 下载地址&#xff1a; IDM-v6.42.20-Repack 解压密码&#xff1a;helloh 下载时可能会有广告&#xff0c;忽略&#xff0c;等下载结束即可…

IM 旗舰版、IM 尊享版计费说明(海外 - 北美数据中心)

本文档详细描述了适用于使用海外北美数据中心 App 的 IM 旗舰版、IM 尊享版计费套餐及相应增值服务项目的计费细则。 本文档中采用人民币定价&#xff0c;价格仅适用于以人民币结算的服务订单。如果您使用非人民币结算&#xff0c;请咨询相关商务人员。 The English version o…

React 使用ref属性调用子组件方法(也可以适用于父子传参)

注意&#xff1a;①需使用hooks函数组件 ②使用了antDesign组件库&#xff08;可不用&#xff09; 如何使用 父组件代码 import React, { useState, useRef, useEffect } from react; import { Button } from antd; import Child from ./components/child;export defau…

华为面试题就这?24岁的我直接拿下28K的offer...

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 先说一下我的情况&#xff0c;某普通本科计算机&#xff0c;之前在深圳那边做了大约半年多少儿编程老师&#xff0c;之后内部平调回长沙这边&#xff0c;回来之后发…

LLaVA 简介:一种多模式 AI 模型

LLaVA 是一个端到端训练的大型多模态模型&#xff0c;旨在根据视觉输入&#xff08;图像&#xff09;和文本指令理解和生成内容。它结合了视觉编码器和语言模型的功能来处理和响应多模态输入。 图 1&#xff1a;LLaVA 工作原理的示例。 LLaVA 的输入和输出&#xff1a;连接视觉…

大型语言模型(LLM)历史简介

在 DALL-E 2 中生成的图像。 介绍 当我们谈论大型语言模型 (LLM) 时&#xff0c;我们实际上指的是一种能够以类似人类的方式进行交流的高级软件。这些模型具有理解复杂上下文并生成连贯且具有人情味的内容的惊人能力。 如果您曾经与 AI 聊天机器人或虚拟助手聊天&#xff0c…

搜维尔科技:【研究】Haption Virtuose外科手术触觉视觉学习系统的开发和评估

Haption面临挑战 除此之外&#xff0c;外科医生有时会对骨组织进行非常复杂的手术&#xff0c;其中一个例子是人工耳蜗的手术植入。重要的是要避免神经或血管等危险结构受伤&#xff0c;并尽可能轻柔地进行手术。在外科医生能够安全、无差错地进行此类手术之前&#xff0c;需要…

WKWebView加载项目中网页的资源图片路径异常

问题原因&#xff0c;将含有html的文件通过如下方式引入到工程中&#xff1a; 这种处理方式&#xff0c;当应用程序变以后&#xff0c;引入的文件会被全部放在Resources目录下&#xff0c;而忽略你原本的文件路径信息。因此导致出问题。 解决方案&#xff1a; 采用如下方式引…

输入一个列表,返回手动反转后的新列表

import math def deverseHanshu(*nums):listAlist(nums)for i in range(0,math.ceil(len(listA)/2)): #math.ceil(3.14) #4clistA[-(i1)]listA[-(i1)]listA[i]listA[i]creturn listA print(deverseHanshu(45,3,89,45,56,2,22,10))#方法2 def getReverse(listAttr):resultList[…

第133天:内网安全-横向移动域控提权NetLogonADCSPACKDC永恒之蓝

案例一&#xff1a;横向移动-系统漏洞-CVE-2017-0146 这个漏洞就是大家熟悉的ms17-010&#xff0c;这里主要学习cs发送到msf&#xff0c;并且msf正向连接后续 原因是cs只能支持漏洞检测&#xff0c;而msf上有很多exp可以利用 注意msf不能使用4.5版本的有bug 这里还是反弹权…

国自然放榜在即!用这种方法或可抢先查询...

【SciencePub学术】本期热点 国自然 昨日国自然网站提示&#xff1a;系统将于8月20日12:00-12:30进行维护&#xff0c;请您避开该时间段使用&#xff0c;由此给您造成的不便&#xff0c;敬请谅解。 根据往年的经验&#xff0c;这预示着基金评审结果即将公布&#xff0c;应该就…

Apache Dolphinscheduler Standalone 部署教程

Standalone 仅适用于 DolphinScheduler 的快速体验. 如果你是新手&#xff0c;想要体验 DolphinScheduler 的功能&#xff0c;推荐使用Standalone方式体检。 如果你想体验更完整的功能&#xff0c;或者更大的任务量&#xff0c;推荐使用伪集群部署。如果你是在生产中使用&…

安卓开发:基础返回按钮代码

我们在大部分页面都会配一个返回按钮。虽然实现起来非常简单&#xff0c;但是很多开发者不想动这个脑筋。这边给出通用的基础代码&#xff0c;可以直接复制粘贴使用。 <androidx.appcompat.widget.Toolbarandroid:id"id/<>"android:layout_height"wra…

Java中“final、finally、finalize”三者的区别

Java中的"final"、"finally"和"finalize"是三个不同的关键字&#xff0c;它们各自有不同的用途和含义&#xff1a; 1. final - 用于声明一个变量、方法或类是不可变的。 - 被声明为final的变量一旦被初始化后&#xff0c;其值不能被改变。 …

5、并发锁机制之synchronized

并发锁机制之synchronized i/i--引起的线程安全问题分析原因分析i的JVM字节码指令i--的JVM 字节码指令结论 解决方案 synchronized的使用加锁方式使用synchronized解决之前的共享问题方式一方式二 synchronized底层实现原理分析查看synchronized的字节码指令序列重量级锁实现之…

国富基金入股的关联性与奇瑞依赖症,大昌科技业务独立性引关注

《港湾商业观察》廖紫雯 日前&#xff0c;安徽大昌科技有限公司&#xff08;以下简称&#xff1a;大昌科技&#xff09;更新招股书并完成三轮问询&#xff0c;公司冲刺深交所创业板得到进一步进展。此前&#xff0c;2023年6月&#xff0c;大昌科技IPO获深交所受理&#xff0c;…

Qt使用开发板上的按键-思维导图-学习笔记-基于正点原子阿尔法开发板

Qt使用开发板上的按键 出厂内核设备树中注册的按键 I.MX6U设备树路径为arch/arm/boot/dts/imx6ull-14x14-evk.dts 如何看这个按键的键值对应键盘中的按键 键值宏定义是在<linux/input.h>头文件中 资源简介 ALPHA 开发板的 KEY0 按键原理图 应用实例 按键注册 正点…

浅谈【网络编程】之Unix与多路复用

目录 1、Unix域协议 2、多路复用 select poll / epol 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&#xff01;&#xff01;&#xff01; 希望我的文章内容能对你有帮助&#xff0c;一起努力吧&#xff01;…

Spring理论知识(Ⅰ)——Spring分层结构,Spring模块数据访问与继承

1. Spring是什么&#xff1f; Spring是于2003 年兴起的一个轻量级的Java开发框架&#xff0c;由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层…