当前位置: 首页 > news >正文

C语言——指针进阶(三)

目录

一.前言摘要

二.排序函数qsort的模拟实现

三.指针和数组笔试题解析


一.前言摘要

讲述关于strlen和sizeof对于各种数组与指针的计算规则与用法。另外还有qsort函数的模拟实现(可以排序任意类型变量)

二.排序函数qsort的模拟实现

目标:用冒泡排序的思想,模拟实现一个排序函数,可以排序任意类型的数据。

我们先来进行两个小测试:

测试一:

冒泡排序已经是老主顾了,只要明白每一次对比(最坏情况)的趟数就可以用双层for循环写出来了。

 测试一结束,结论:只能排序整型数组。

测试二:

当我们往bubble_sort函数输入实参时会发现接受实参的变量类型只能是int,与结构体不匹配。

接下来我们就要对bubble_sort函数重新作出修改了。

上岸先斩意中人,改函需修形参路。我们可以发现两个测试传输的实参都是地址,那我们就选择用万金油的void* 指针(可以接收任何类型的地址)进行接收。

除了知道元素的起始地址和个数,还需要知道一个元素的大小,这样下一个元素存放在哪里才能知道。所以我们又引进了一个新的变量size_t size.

下面对内部排序进行分析:

首先无论是整型排序还是结构体排序它的趟数都是一样的,都需要慢慢去对比。唯一要变的是这一段代码。

应对不同类型的对比,两个元素的比较方法也是不一样的,总不能用>来对比结构体吧。

我们不妨提供一个专门对比两个元素大小的函数,如果前一个元素>0那就让cmp返回一个大于0的数,如果相等就返回0,后一个元素大就返回小于0的数。

那我们如何还函数里调用这个cmp函数呢,我们可以在添加一个形参,这个形参是一个函数指针,存储的是cmp函数的地址(这样就可以指向该地址并调用它了),而这个函数指针指向函数的两个参数e1和e2分别是我们需要对比的两个元素(这里用指针来接收它们),最后该函数指针的返回类型是int(因为要分两个元素的大小情况而返回不同的数值)。

因为我们要作相减运算,所以这里对e1和e2进行强制类型转换后再解引用。

接下来我们要思考如何把arr[j]与arr[j+1]的地址传给cmp函数:

通过图示我们可以知道base是指向首个元素的地址的,那能不能对它进行base+1来指向下一个元素呢?答案是不行,虽然void*是万金油可以接收任意类型的地址,但它也有弊端——就是不能+-整数来改变指针指向。

强制转换成int*的话也不合适,那我们干脆就直接强制转换为char*,当我们需要指向下一个元素的时候又知道元素大小,直接加上就可以跳转指向了。一开始我们是9和8比,后面又该如何实现9和7比呢?

既然本质是相邻元素比较,那我们就和j联系起来,通过j*size来实时实现2相邻元素的对比。

我们对两个元素进行交换也要作出相应的变化,由于是不清楚该元素的类型,所以我们采用的是一个字节对应一个字节的交换。

可以有人会有疑惑,这里为什么不直接创造一个第三变量交换呢?假如创建第三变量,那变量类型我们不清楚是没办法创建的。

我们可以通过临时创造出来的字节(char类型)对两个元素的字节一个一个进行交换

至此,这个通用类型的排序函数就改造完成了。我们先来测试一下整型数组test1。

整体结构图:

接下来我们来测试结构体里面的年龄大小:

再创造一个比较结构体的函数

当我们按照年龄来比后:

如果想要按照名字来比:

那就再创建一个函数,只不过字符串对比需要用到strcmp来比较。

整体结构图:

当我们想要把升序改为降序时,来看看应该更改哪些地方。

三.指针和数组笔试题解析

开胃小菜:

整型:

字符:

到&arr这里需要特殊说明一下,虽然strlen接收类型是用const char* str接收,数组指针char(*)[6]会发生类型转换,但本质上整个数组地址和首个元素地址一开始都是一样的,所以strlen还是会从最开始的首个地址开始相后寻找\0

再来一组:

这里并不是把abcdef存到p里面去,更准确的应该是把a的地址存到p里面,让p能够找到abcdef\0这段字符串。

相关文章:

C语言——指针进阶(三)

目录 一.前言摘要 二.排序函数qsort的模拟实现 三.指针和数组笔试题解析 一.前言摘要 讲述关于strlen和sizeof对于各种数组与指针的计算规则与用法。另外还有qsort函数的模拟实现(可以排序任意类型变量) 二.排序函数qsort的模拟实现 目标:…...

三勾商城(java+vue3)微信小程序商城+SAAS+前后端源码

项目介绍 本系统功能包括: 前台展示后台管理SAAS管理端,包括最基本的用户登录注册,下单, 购物车,购买,结算,订单查询,收货地址,后台商品管 理,订单管理&…...

【洁洁送书第七期】现在学 Java 找工作还有优势吗

java 现在学 Java 找工作还有优势吗?活力四射的 JavaTIOBE 编程语言排行榜从零开始学会 JavaJava 语言运行过程基础知识进阶知识高级知识talk is cheap, show me the code结语 文末赠书 现在学 Java 找工作还有优势吗? 在某乎上可以看到大家对此问题的…...

npm发布自定义vue组件库

npm发布自定义vue组件库 创建项目 vue create test-ui自定义组件 创建自定义组件,组件名称根据你的需求来,最好一个组件一个文件夹,下图是我的示例。 src/components 组件和你写页面一样,所谓组件就是方便实用,不用…...

9.12 C++作业

实现一个图形类(Shape),包含受保护成员属性:周长、面积, 公共成员函数:特殊成员函数书写 定义一个圆形类(Circle),继承自图形类,包含私有属性:半…...

利用LinuxPTP进行时间同步(软/硬件时间戳) - 研一

转自:https://blog.csdn.net/BUPTOctopus/article/details/86246335 官方文档:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s1-using_ptp 查看网卡是否支持软硬件时间戳: sudo ethtoo…...

《极客时间:左耳听风——程序员练级攻略》【文章笔记个人思考】

原文链接:https://time.geekbang.org/column/intro/100002201 69 | 程序员练级攻略:开篇词70 | 程序员练级攻略:零基础启蒙编程入门入门语言 Python入门语言 JavaScript操作系统入门 Linux编程工具 Visual Studio CodeWeb 编程入门实践项目小…...

Springboot 实践(15)spring config 配置与运用—自动刷新

目前,网络上讲解spring config的自动刷新,都是通过git服务站的webhook功能执行“actuator/bus-refresh”服务实现的自动刷新。我们的前文讲解的配置中心,配置中心仓库使用的时本地地址,如下图所示: 那么,配…...

FirmAFL

FirmAFL使用并改进了Firmdyne模拟方式,并利用AFL对IoT固件实施高通量灰盒Fuzzing。 一、项目简介 FIRM-AFL 是 第一个针对物联网固件的高吞吐量灰盒模糊测试器。 支持mipsel、mipseb和armel三种CPU架构 ,涵盖Firmadyne数据库中90.2%的固件。 FIRM-AFL 解…...

SpringMVC的整合完成CRUD(增删改查)

SpringMVC是一种基于Java的Web框架,它是Spring框架的一部分。SpringMVC通过使用MVC(Model-View-Controller)设计模式来组织和管理Web应用程序的开发。 在SpringMVC中,Model代表数据模型,View代表用户界面,C…...

Postman使用_Tests Script(断言测试)

断言测试可以在Collection、Folder和Request的 pre-request script 和 test script中编写,测试脚本可以检测请求响应的各个方面,包括正文、状态代码、头、cookie、响应时间等,只有测试符合自定义的要求后才能通过。 pm对象提供了测试相关功能…...

问道管理:华为概念股捷荣技术13天10板,监管质疑迎合热点炒作

捷荣技能(002855.SZ)一口气将气氛拉满。 盘面看,自8月29日启动到9月14日,捷荣技能用了13天时间,将累计涨幅推到了188%,期间有10个涨停板,如此冷艳之举,还在于其“华为概念”。 ​ …...

VR云游:让游客足不出户享受旅行的乐趣

随着人们的生活水平不断提高,对于旅行的需求也在日益增长,既要玩的舒心,也要享受的舒服,因此VR全景云游就成为了一种新型的旅行方式,人们足不出户就可以沉浸式游览各地自然风光与名胜古迹。 VR云游景区是一种全新的旅游…...

vue3学习源码笔记(小白入门系列)------ 重点!响应式原理 代码逐行分析

目录 备注响应式数据创建ref 和 reactive 核心 作用第一轮的 依赖收集 发生时机setup 阶段 去更改了 响应式数据 会发生依赖收集吗 派发更新派发更新是什么时候 触发的?扩展: setup阶段 响应式数据被修改 会触发组件更新吗 vue 是如何根据派发更新来触发…...

62、SpringBoot 使用RestTemplate 整合第三方 RESTful 服务

这节的要点: 就是弄两个项目 , 从 端口9090 这个项目,通过 restTemplate, 去访问 端口8080 的项目,并获取8080项目的数据。 ★ RESTful服务包含两方面的含义 1. 自己的应用要暴露一些功能供别人来调用。此时我们是服…...

Linux基本认识

一、Linux基本概念 Linux 内核最初只是由芬兰人林纳斯托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。 Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多…...

leetcode top 100 (8)无重复字符的最长子串(滑动窗口

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 package TOP1_10;import java.util.HashMap; import java.…...

我也惊呆了!原来软件开发根本不需要会编码

一、前言 众所周知,完成一个大型的企业级系统,公司往往需要大量的人力做支持后盾,例如需要需求分析师、数据库管理员、前台美工、后台程序员、测试人员等。在快速发展中的企业,尤其是中小企业,都是一个萝卜多个坑&…...

定制化图标——Element UI 组件图标替换指南

本篇博客将介绍如何在使用 Element UI 组件时对原生图标进行定制化替换,提供了适用于满足个性化需求的方法和技巧。 引言 Element UI 是一款基于 Vue.js 的流行 UI 组件库,在前端开发中得到广泛应用。然而,在使用 Element UI 的组件时&#…...

63、SpringBoot---定制 RestTemplate--消息转化器、拦截器

★ 定制RestTemplate 如要对RestTemplate进行自定义设置,Spring Boot也提供了两种主要方式:▲ 局部式:在调用RestTemplateBuilder构建RestTemplate之前,先调用RestTemplateBuilder的方法对其定制,通过这种方式设置的R…...

移动端视频适配难题:xgplayer的CSS全屏模式实战指南(含16:9与9:16适配技巧)

移动端视频适配难题:xgplayer的CSS全屏模式实战指南(含16:9与9:16适配技巧) 在移动端视频播放场景中,屏幕比例适配一直是开发者面临的棘手问题。传统全屏模式在处理非常规比例视频(如竖屏9:16内容)时往往表…...

OpenClaw沙盒体验:不装本地环境玩转GLM-4.7-Flash

OpenClaw沙盒体验:不装本地环境玩转GLM-4.7-Flash 1. 为什么选择沙盒体验? 作为一个长期关注AI自动化工具的技术爱好者,我一直在寻找一个既能快速验证想法又不会污染本地开发环境的方式。OpenClaw的本地部署虽然强大,但配置过程…...

效率提升秘籍:用快马平台一键生成21届智能车优化算法模块

提升21届智能车开发效率的实战经验分享 最近在准备21届智能车比赛时,我发现传统开发方式存在不少效率瓶颈。从底层驱动到算法框架,每个环节都需要大量时间调试,而比赛周期又非常紧张。经过反复摸索,我总结出一套能显著提升开发效…...

小白友好!FunASR语音识别镜像部署教程,开箱即用

小白友好!FunASR语音识别镜像部署教程,开箱即用 1. 快速了解FunASR语音识别 FunASR是由阿里云推出的开源语音识别工具包,它就像是一个能听懂人说话的智能助手。想象一下,你对着手机说话,它能立刻把你说的话变成文字—…...

别再纠结在线辨识了!聊聊永磁同步电机(PMSM)离线参数自学习的完整流程与避坑指南

永磁同步电机离线参数辨识实战:从理论到工程落地的全流程解析 在电机控制领域,参数辨识一直是个让人又爱又恨的话题。尤其是当项目从实验室走向量产时,那些在仿真中运行良好的算法,往往会因为实际电机参数的偏差而表现失常。我曾亲…...

OpenClaw成本优化方案:ollama GLM-4-7-Flash替代OpenAI API实测

OpenClaw成本优化方案:ollama GLM-4-7-Flash替代OpenAI API实测 1. 为什么需要寻找OpenAI API的替代方案 去年我开始在个人项目中使用OpenClaw实现自动化办公流程时,很快被OpenAI API的token消耗速度震惊了。一个简单的"读取邮件附件-解析内容-生…...

ABYSSAL VISION(Flux.1-Dev)风格化研究:模拟Typora等工具的极简文档配图

ABYSSAL VISION(Flux.1-Dev)风格化研究:模拟Typora等工具的极简文档配图 不知道你有没有过这样的体验:写技术文档或者博客的时候,文字部分洋洋洒洒,逻辑清晰,但一到需要配图说明的地方就卡壳了…...

A-59F 多功能语音处理模组:覆盖全场景人群,让每一次语音都清晰无噪

在门禁对讲、会议扩音、车载通话、导游喊话、监护设备、智能工牌等各类语音设备中,啸叫刺耳、环境嘈杂、回音不断、拾音模糊、通话断续是所有人共同的痛点。一款真正解决问题的核心硬件 ——A-59F 多功能语音处理模组,它集成扩音防啸叫、AI ENC 降噪、AE…...

【声音克隆】Qwen3-TTS-12Hz-1.7B-Base优化技巧:如何生成更自然、更逼真的语音

【声音克隆】Qwen3-TTS-12Hz-1.7B-Base优化技巧:如何生成更自然、更逼真的语音 1. 理解Qwen3-TTS的核心能力 1.1 多语言与方言支持 Qwen3-TTS-12Hz-1.7B-Base模型支持10种主要语言和多种方言风格,包括中文、英文、日文等。这种广泛的语言覆盖能力使其…...

智慧医疗泡罩药板药片缺失缺陷检测数据集VOC+YOLO格式1300张3类别

注意数据集中图片大约500张是原图剩余为增强图片数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1300标注数量(xml文件个数):1300…...