指针深入了解7

news2024/12/23 14:46:55

1.qsort的模拟实现(冒泡排序的原型制作)

1.排序整型
int cmp_int(const void* p1, const void* p2)
{
	return *((int*)p1) - *((int*)p2);
}
void swap(char* p1, char* p2)//完成交换
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;

}
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* p1, const void *p2))

{
	  for (int i = 0; i < sz - 1; i++)//趟数
	  {

		  for (int j = 0; j <sz-1-i ; j++)
		  {
			  if (cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)//找到两个元素的地址
			  {
				  swap((char*)base + j*width, (char*)base + (j+1) *width);//char*的指针才是加几就跳过几个字节。

			  }

		  }
	  }

}
void pint(int arr[], int sz)
{

	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
 }
void test3()
{

	int arr[] = { 3,5,7,9,1,2,4,6,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int width = sizeof(arr[0]);
	pint(arr, sz);
	printf("\n");
	bubble_sort(arr, sz, width, cmp_int);
	pint(arr, sz);
}
int main()
{
	test3();
	return 0;
}

在上述代码中我们需要完和qsort一样的排序功能,我们就需要改变冒泡排序的参数,变得和qsort一样,这样的话我们才能完成排序任意类型的数据。首先我们发现之前冒泡排序的交换规则也只能交换int类型的数据,所以我们也需要进行修改,我们想到使用char*的指针一个字节一个字节的交换,这样的话任意类型都可以进行交换。为了方便观察我们在排序前排序后都打印一次arr这样就方便那观察。

结果如下:

 我们可以看到完成为了我们的排序要求,那它能不能完成结构体的排序呢?

2.排序结构体

我们来试试:

struct Stu
{
	char name[20];
	int age;
};
int sort(const void* p1, const void* p2)//结构体不需要解引用
{
	return strcmp(((struct Stu*)p1)->name , ((struct Stu*)p2)->name );//strcmp库函数的返回值刚好满足qsort函数的第四个参数的需要
}
void swap(void* p1, void* p2, int width)
{
	char tmp;
	for (int i = 0; i < width; i++)
	{
		tmp = *((char*)p1 + i);
		*((char*)p1 + i) = *((char*)p2 + i);
		*((char*)p2 + i) = tmp;
	}

}


void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* p1, const void *p2))

{
	  for (int i = 0; i < sz - 1; i++)//趟数
	  {

		  for (int j = 0; j <sz-1-i ; j++)
		  {
			  if (cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)//找到两个元素的地址
			  {
				  swap((char*)base + j*width, (char*)base + (j+1) *width,width);//char*的指针才是加几就跳过几个字节。
			  }

		  }
	  }

}
void print1(struct Stu*pt,int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d ", pt->name, pt->age);
		pt++;
    }
}
void test1()
{
	struct Stu arr[3] = { {"zhangsan",23},{"lisi",28},{"wangwu",18} };
	int sz = sizeof(arr) / sizeof(arr[0]);
		int width = sizeof(arr[0]);	
		print1(arr, sz);
		printf("\n");
		bubble_sort(arr, sz, width, sort);
		print1(arr, sz);
}
int main()
{
	test1();
	return 0;
}

需要注意的是我们要将swap函数修改一下。

结果如下:

2.字符分类函数

C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。
这些函数的使⽤都需要包含⼀个头文件是 <ctype.h>

这些函数都是比较简单的我们挑几个试试,剩下的都差不多的操作。

 1.islower和isupper

我们看到它的返回值为int,其实字符是以ASCLL码值存储在内存中,所以也属于int类型的。

islower函数输入一个小写字母就返回大于0的值,大写就返回一个小于0的值。isuppper相反。

 

2.tolower 和toupper

那么怎样将字母改变其大小写呢?我们就要使用这两个函数了,它们的头文件也是

<ctype.h>.

演示如下:

结果为:

我们给toupper函数传小写时它就会将其改为大写,传大写就不会修改。tolower刚好相反。

3.模拟实现tolower函数
char my_tolower(char *pt)
{
	if (*pt)
	{
		*pt = *pt + 32;
		return *pt;
	}
	else
		return 0;

}
int main()
{
	char arr[] = "YOU";
	size_t sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		arr[i] = my_tolower(&arr[i]);
	}
	printf(arr);
	return 0;
}

我们运用大写字母和小写字母的ASCLL码值相差32来实现,大家也可以试试模拟实现touppper。

 

谢谢

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

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

相关文章

Docker本地部署可编辑开源导航页并发布公网分享好友可访问

文章目录 1. 使用Docker搜索镜像2. 下载镜像3. 查看镜像4. 启动容器5. 浏览器访问6. 远程访问6.1 内网穿透工具安装6.2 创建远程连接公网地址6.3 使用固定二级子域名地址远程访问 今天和大家分享如何使用Docker本地部署一个开源的简约风格网址导航页&#xff0c;支持五种搜索引…

成熟的汽车制造供应商协同平台 要具备哪些功能特性?

汽车行业是一个产业链长且“重”的行业&#xff0c;整个业务流程包括了研发、设计、采购、库存、生产、销售、售后等一系列环节&#xff0c;在每一个环节都涉及到很多信息交换的需求。对内要保证研发、采购、营销等业务环节信息流通高效安全&#xff0c;对外要与上、下游合作伙…

【LeetCode每日一题】1109. 航班预订统计1094. 拼车 (差分数组)

差分数组 差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减。 一、基本概念&#xff1a; 差分数组的定义如下&#xff1a; 假设原始数组为arr&#xff0c;差分数组为diff&#xff0c;其中diff[i] arr[i] - arr[i-1]&#xff08;0 < i < n&#xff0…

机器学习 | 掌握逻辑回归在实践中的应用

目录 初识逻辑回归 逻辑回归实操 分类评估方法 初识逻辑回归 逻辑回归&#xff08;LogisticRegression&#xff09;是机器学习中的一种分类模型&#xff0c;逻辑回归是一种分类算法&#xff0c;虽然名字中带有回归&#xff0c;但是它与回归之间有一定的联系。由于算法的简单…

搭建网站详细教程

一.领取一个免费域名和SSL证书&&CDN 特点&#xff1a;支持Cloudflare CDN Cloudflare是全球知名的CDN提供商&#xff0c;如果你不想暴露你的源站&#xff0c;又想使用我们的二级域名&#xff0c;不需要前往Cloudflare添加域名&#xff0c;修改NS记录&#xff0c;现在…

Redux状态管理(运行机制及实例)

背景&#xff1a; JavaScript需要管理的状态越来越多&#xff0c;越来越复杂;这些状态包括服务器返回的数据、缓存数据、用户操作产生的数据等等&#xff0c;也包括一些UI的状态&#xff0c;比如某些元素是否被选中&#xff0c;是否显示加载动效&#xff0c;当前分页。 状态之…

prometheus的alertmanager监控报警

监控告警&#xff1a; alert是一个单独的模块&#xff0c;需要我们单独的配置。 需要声明一个邮箱地址。配置是以configmap进行部署。 alert 实验&#xff1a; vim alert-cfg.yaml apiVersion: v1 kind: ConfigMap metadata:name: alertmanagernamespace: monitor-sa data…

【Spring Boot 源码学习】BootstrapRegistry 详解

《Spring Boot 源码学习系列》 BootstrapRegistry 详解 一、引言二、往期内容三、主要内容3.1 源码初识3.2 register 方法3.3 registerIfAbsent 方法3.4 isRegistered 方法3.5 getRegisteredInstanceSupplier 方法3.6 addCloseListener 方法3.7 InstanceSupplier 内部接口类3.7…

༺༽༾ཊ—Unity之-01-工厂方法模式—ཏ༿༼༻

首先创建一个项目&#xff0c; 在这个初始界面我们需要做一些准备工作&#xff0c; 建基础通用文件夹&#xff0c; 创建一个Plane 重置后 缩放100倍 加一个颜色&#xff0c; 任务&#xff1a;使用工厂方法模式 创建 飞船模型&#xff0c; 首先资源商店下载飞船模型&#xff0c…

2024-01-06-AI 大模型全栈工程师 - 机器学习基础

摘要 2024-01-06 阴 杭州 晴 本节简介: a. 数学模型&算法名词相关概念; b. 学会数学建模相关知识&#xff1b; c. 学会自我思考&#xff0c;提升认知&#xff0c;不要只会模仿&#xff1b; 课程内容 1. Fine-Tuning 有什么作用&#xff1f; a. 什么是模型训练&#xff…

springboot144基于mvc的高校办公室行政事务管理系统设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

VMware虚拟机安装统信uos桌面专业版操作系统系统

统信uos桌面版版本对比:https://www.uniontech.com/next/product/desktop-contrast专业版只要是面向政企等单位,这里只是用虚拟机安装测试基本功能使用,对于我们个人要长期使用的话可以使用家庭版或者社区版 1镜像下载 1.1打开官网 镜像在统信生态社区下载统信生态社区官网:…

C#,洛布数(Lobb Number)的计算方法与源代码

1 洛布数&#xff08;Lobb Number&#xff09; 在组合数学中&#xff0c;洛布数&#xff08;Lobb Number&#xff09;L(m&#xff0c;n)计算nm开括号的排列方式&#xff0c;以形成一个有效的平衡括号序列的开始。 Lobb数由两个非负整数m和n参数化&#xff0c;其中n>m>0。…

【金蝶BI方案】用一张报表,分析生产完成情况

当老板问生产完成地怎样&#xff1f;难道还能拿出一叠报表让老板逐个细看&#xff1f;奥威-金蝶BI方案只用一张BI数据可视化报表就把整个生产完成情况给讲明白了。甚至还能满足老板想从不同角度进行分析的需求。 奥威-金蝶BI方案-BI生产完成情况报表 这张报表总结计算了生产合…

微软新的内部开发部门发现了第一个 Windows 12 版本

Windows 11 被证明让很多人有点失望&#xff0c;很多 Windows 10 用户认为没有理由升级。 这意味着有大量用户渴望一些大而令人印象深刻的东西——而这正是 Windows 12 所希望的。 无论您是 Windows 10 的忠实拥趸&#xff0c;还是渴望更新、更闪亮的 Windows 11 采用者&#x…

工具方法 - 找富婆包养的必胜法则

【标准的问题解决方法&#xff0c;以及作业标准与标准作业】 第一步: 明确问题 你的人生轨迹是&#xff1a; 你要解决的问题是&#xff0c;找到自己的爱人。 而立之年&#xff0c;恋爱结婚已成为一大任务&#xff01; 第二步&#xff1a;了解现状 我们在做计划之前必须进行一…

vit细粒度图像分类(七)TBNet学习笔记

1.摘要 细粒度鸟类图像识别致力于实现鸟类图像的准确分类&#xff0c;是机器人视觉跟踪中的一项基础性工作。鉴于濒危鸟类的监测和保护对保护濒危鸟类具有重要意义&#xff0c;需要采用自动化方法来促进鸟类的监测。在这项工作中&#xff0c;我们提出了一种新的基于机器人视觉…

Qt读写Execl:QXlsx库

Qt三方库开发技术&#xff1a;QXlsx介绍、编译和使用 我自己记录的实例代码&#xff1a;https://download.csdn.net/download/cao_jie_xin/88795216 目录 一、概述二、下载三、编译四、加载QXlsx静态库五、介绍一些常用的功能1、一些头文件和命名空间2、创建一个excel文件3、…

二进制安全虚拟机Protostar靶场(5)堆的简单介绍以及实战 heap0

前言 这是一个系列文章&#xff0c;之前已经介绍过一些二进制安全的基础知识&#xff0c;这里就不过多重复提及&#xff0c;不熟悉的同学可以去看看我之前写的文章 什么是堆 堆是动态内存分配的区域&#xff0c;程序在运行时用来分配内存。它与栈不同&#xff0c;栈用于静态…

外包干了8个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…