指针深入了解7

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.mfbz.cn/a/363378.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“文化IP+AI交互数字人”,创新灯会活动互动形式

近日&#xff0c;数字人“少年李白”化身AI交互数字人&#xff0c;亮相横店影视城梦幻谷仙侠灯会&#xff0c;在现场与文化IP“狄仁杰”跨时空语音交互&#xff0c;为新春灯会带来了全新交互体验。在现场游客还可以向数字人“少年李白”提问&#xff0c;了解唐代历史、民俗风情…

上位机是什么?与下位机是什么关系

在工业自动化领域中&#xff0c;上位机是一项关键而引人注目的技术。许多人对上位机的概念感到好奇&#xff0c;想要深入了解其在工业智能中的作用。那么&#xff0c;上位机究竟是什么呢&#xff1f; 首先&#xff0c;上位机是一种用于工业控制系统的软件应用&#xff0c;通常…

《角斗士2》AI电影高清宣传片

《角斗士2》AI电影高清宣传片 The gladiator returns, a legend reborn in the arenas fires. From the dust of the Colosseum, a new hero shall rise. In the heart of Rome, a battle for freedom and justice shall be waged. The Colosseum roars with the bloodlust …

axios-AJAX入门

定义 概念&#xff1a;AJAX是浏览器与服务器进行数据通信的技术 使用 1.先使用axios库&#xff0c;与服务器进行数据通信 1&#xff09;基于XMLHttpRequest封装、代码简单、月下载量在14亿次 2&#xff09;Vue、React项目中都会用到axios 2.再学习XMLHttpRequest对象的使用…

H5 嵌套iframe并设置全屏

H5 嵌套iframe并设置全屏 上图上代码 <template><view class"mp-large-screen-box"><view class"mp-large-screen-count"><view class"mp-mini-btn-color mp-box-count" hover-class"mp-mini-btn-hover" clic…

数据库技术栈 —— B树与B+树

数据库技术栈 —— B树与B树 一、复习二、MySQL中的B树应用 一、复习 B树是多路平衡查找树的意思 参考文章或视频链接[1] 【王道计算机考研 数据结构】 二、MySQL中的B树应用 这篇文章里的计算题还是讲的不错的。 参考文章或视频链接[1] 《探究MySQL的索引结构选型》

计算机系统体系结构

文章目录 计算机系统体系结构1. 什么是计算机体系结构术语解释计算机系统体系结构所涉及的内容简单通用计算机结构计算机指令程序执行过程时钟 2. 计算机的发展机械计算机机电式计算机早期电子计算机微机和PC革命移动计算和云计算摩尔定律乱序执行 3. 存储程序计算机寄存器传输…

APT攻击是什么?如何进行防护

随着网络技术的飞速发展&#xff0c;APT&#xff08;Advanced Persistent Threat&#xff09;攻击已经成为网络安全领域的一个重大问题。APT攻击是一种高度复杂的网络攻击&#xff0c;其目标是长期潜伏并逐步深入到目标网络中&#xff0c;以窃取敏感信息、破坏关键基础设施或制…

如何有效获取 Go 变量类型?探索多种方法

嗨&#xff0c;大家好&#xff01;本文是系列文章 Go 小技巧第九篇&#xff0c;系列文章查看&#xff1a;Go 语言小技巧。 文章目录 Go 的类型系统类型获取使用 fmt.Printf类型选择类型选择反射 reflect.TypeOf 其他注意点错误处理性能考量 总结 在 Python 中&#xff0c;可以使…

AI绘画探索人工智能的未来

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-8fL64RHWVzwpzR6m {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

spdk技术原理简介和实践经验

一、导读 与机械硬盘相比&#xff0c;NVMe-ssd在性能、功耗和密度上都有巨大的优势&#xff0c;并且随着固态存储介质的高速发展&#xff0c;其价格也在大幅下降&#xff0c;这些优势使得NVMe-ssd在分布式存储中使用越来越广泛。由于NVMe-ssd的性能比传统磁盘介质高出很多&…

C语言指针学习(1)

前言 指针是C语言中一个重要概念&#xff0c;也是C语言的一个重要特色&#xff0c;正确而灵活地运用指针可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人都应当深入的学习和掌握指针&#xff0c;也可以说不掌握指针就没有掌握C语言的精华。 一、什么是指针 想弄清楚什…

2024年第4届IEEE软件工程与人工智能国际会议(SEAI 2024)

2024年第4届IEEE软件工程与人工智能国际会议(SEAI 2024)将于2024年6月21-23日在中国厦门举办。 SEAI旨在为软件工程与人工智能领域搭建高端前沿的交流平台&#xff0c;推动产业发展。本次会议将汇聚海内外的知名专家、学者和产业界优秀人才&#xff0c;共同围绕国际热点话题、核…

cesium-场景出图场景截屏导出图片或pdf

cesium把当前的场景截图&#xff0c;下载图片或pdf 安装 npm install canvas2image --save npm i jspdf -S 如果安装的插件Canvas2Image不好用&#xff0c;可自建js Canvas2Image.js /*** covert canvas to image* and save the image file*/ const Canvas2Image (function…

红队渗透靶机:LEMONSQUEEZY: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 目录扫描 1、dirsearch 2、gobuster WEB phpmyadmin wordpress wpscan 登录wordpress 登录phpmyadmin 命令执行 反弹shell 提权 get user.txt 信息收集 本地提权 信息收集 1、arp ┌──(root㉿ru)-[~…

PRBS并行输出

PRBS&#xff08;Pseudo-Random Binary Sequences&#xff09;是通过LFSR和特征函数 伪随机数发生器产生的伪随机数序列&#xff0c;通常用于高速数字通信测试。 基本电路&#xff08;单比特输出&#xff09; prbs N表示用N比特lfsr尝试伪随机数序列&#xff0c;常用的有N7,9…

win10查看Nvidia显卡、cuda版本

通过cmd命令行查看 打开cmd命令行窗口&#xff0c;在命令行输入&#xff1a; nvidia-smi 即可看到相应的显卡信息&#xff0c;以及显卡支持的cuda版本。 如下图所示&#xff0c;可以看到显卡是"GeForce CTX 1650"&#xff0c;cuda版本是11.7

Mac brew教程

一、安装brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"二、查看brew版本 brew -vbrew -v 三、搜索软件 命令格式&#xff1a;brew search 软件名 eg&#xff1a; brew search nginx四、安装软件 命令格…

Springboot + EasyExcel + Vue 实现excel下载功能

一、添加EasyExcel依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version></dependency> 二、后端代码示例 controller&#xff1a; GetMapping("/download&quo…

SwiftUI 动画入门之一:路径动画(Path Animations)

概览 在 SwiftUI 的开发中,我们往往需要使用千姿百态的动画把我们的界面元素妆点的更加鲜活灵动。 如上图所示,我们使用路径动画使折线图更加生动了!这是怎么做到的呢? 在本篇博文中,您将学到以下内容: 概览1. 路径与形状(Path and Shape)2. 路径动画的原理3. 让路径…