指针深入了解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;}elsereturn 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.mzph.cn/news/658395.shtml

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

相关文章

Boundry attention: 泛化能力很强的边缘检测模块

原文链接&#xff1a;Boundary attention:: Learning to Find Faint Boundaries at Any Resolution 本文提出的模型泛化性好&#xff0c;即使只在合成的图案简单的图片上训练&#xff0c;在复杂的真实图上做检测也能得到较好的边界。 细节部分&#xff1a; 不同于viT把图片切…

Django框架——第一个Django程序

大家好&#xff0c;在很久之前&#xff0c;我写了一系列关于Flask框架的文章&#xff0c;得到了不错的反馈&#xff0c;这次我打算写一系列关于Django框架的文章&#xff0c;希望大家多多支持&#xff0c;多给一些写作意见。 Django Django是用Python语言编写的开源web应用框…

matlab自定义函数实现图像小波变换

matlab中提供了小波变换函数lwt和ilwt&#xff0c;可以方便地实现提升小波变换。 我们按照小波变换的定义&#xff0c;粗糙地实现一个针对图像的小波变换&#xff0c;如下&#xff1a; % 使用方法&#xff1a; img imread(lena256.bmp); % 假设lena.png是灰度图像 subplot(2…

上门服务系统|如何搭建一款高质量的上门服务软件

预约上门系统源码开发是一项复杂而有挑战性的任务&#xff0c;但也是实现智能化预约服务的关键一步。通过自主开发预约上门系统的源码&#xff0c;企业可以完全定制系统的功能、界面和安全性&#xff0c;从而为用户提供更高效、便捷、个性化的预约体验。本文将带你深入了解预约…

S275智慧煤矿4G物联网网关:矿山开采的未来已来

随着经济发展煤矿需求不断激增&#xff0c;矿山矿井普遍处于偏远山区&#xff0c;生产管理、人员安全、生产效率是每个矿山矿井都需要考虑的问题&#xff0c;利用网关对现场终端设备连接组网&#xff0c;实现智慧煤矿远程管理。 各矿山矿井分布范围比较广泛&#xff0c;户外环…

(学习日记)2024.01.27

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

GNU链接脚本的MEMORY命令解析

1、GUN中对MEMORY指令的描述 《GUN的官网描述》 2、MEMORY命令的格式 MEMORY{name [(attr)] : ORIGIN origin, LENGTH len…}实例&#xff1a; MEMORY {/* 描述设备的内存区域 */rom (rxa) : ORIGIN 0x80000000, LENGTH 512Kram (wxa) : ORIGIN 0x80080000, LENGTH 51…

Vue2中给对象添加新属性界面不刷新?

在 Vue.js 中&#xff0c;如果你在对象上添加新属性而界面没有刷新&#xff0c;这可能是由于Vue的响应性系统的特性所导致的。Vue在初始化时会对数据进行响应式转换&#xff0c;这意味着只有在初始时存在的属性才会被监听&#xff0c;后来添加的属性不会自动触发视图更新。 我…

ElementUI 组件:Container 布局容器实例

ElementUI安装与使用指南 Container 布局容器 点击下载learnelementuispringboot项目源码 效果图 项目里el-container-example.vue代码 <script> export default {name: el_container_example,data() {const item {date: 2024-01-31,name: 国龙,address: 上海市某区…

并网逆变器学习笔记8---平衡桥(独立中线模块)控制

参考文献&#xff1a;《带独立中线模块的三相四线制逆变器中线电压脉动抑制方法》---赵文心 一、独立中线模块的三相四线拓扑 独立中线模块是控制中线电压恒为母线一半&#xff0c;同时为零序电流ineu提供通路。不平衡负载的零序电流会导致中线电压脉动&#xff0c;因此需要控制…

微信小程序引导用户打开定位授权通用模版

在需要使用位置信息的页面&#xff08;例如 onLoad 或 onShow 生命周期函数&#xff09;中调用 wx.getSetting 方法检查用户是否已经授权地理位置权限&#xff1a; Page({onLoad: function() {wx.getSetting({success: res > {if (res.authSetting[scope.userLocation]) {/…

力扣hot100 分割回文串 集合 dfs

Problem: 131. 分割回文串 文章目录 思路Code&#x1f496; DP预处理版 思路 &#x1f468;‍&#x1f3eb; 参考题解 Code import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List;public class Solution {int n;//字符…

卷子怎么扫描成电子版?试试这些软件

卷子怎么扫描成电子版&#xff1f;随着科技的进步&#xff0c;越来越多的纸质文档正在被数字化所取代。如果你手头有一份纸质试卷&#xff0c;想要将其转化为电子版&#xff0c;却不知道该如何操作&#xff0c;那么今天我们将为你介绍5款软件&#xff0c;让你轻松实现这一目标。…

倒计时68天

题单详情 - 蓝桥云课 (lanqiao.cn) 2.2.串门 - 蓝桥云课 (lanqiao.cn) #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; const int inf0x3f3f3f3f; typedef pair<int,int> pii; vector<pii>ve[N]; int dis[N];//记录以…

探索美颜技术:美颜SDK是什么?

今天&#xff0c;笔者将于大家一同探讨美颜技术&#xff0c;重点聚焦于美颜SDK的定义、工作原理以及在不同领域的应用&#xff0c;以期为读者带来一场有关美颜技术背后秘密的深度探索。 一、什么是美颜SDK&#xff1f; 美颜SDK是一套旨在为开发者提供美颜算法和功能的工具包。…

安卓主板_紫光展锐T820安卓主板方案定制

安卓主板采用了性能强劲的紫光展锐T820八核处理器&#xff0c;搭载了Android 13系统&#xff0c;为用户带来更加顺畅的操作体验。该主板不仅采用了6nm工艺&#xff0c;更加强大的算力和优越的性能&#xff0c;能够轻松实现多任务运行&#xff0c;不会出现卡顿现象。 此外&#…

和朋友随时随地玩——幻兽帕鲁服务器极简部署流程

什么是游戏服务器&#xff1f;通俗来说就是一个公共的电脑&#xff0c;玩家可以在任意时刻进入服务器游玩&#xff0c;不需要等待某个玩家创建房间&#xff0c;即可任意在一个世界一起游戏 本文将为您提供极简部署幻兽帕鲁服务器的指引&#xff0c;「仅需轻点三次鼠标&#xff…

C++ 手记

extern关键字 extern 存储类用于提供一个全局变量的引用&#xff0c;全局变量对所有的程序文件都是可见的。 当有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时&#xff0c;可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。通常用于当有两个或多…

大数据学习之Redis,十大数据类型的具体应用(二)

目录 3.5 Redis 集合&#xff08;Set&#xff09; 单值多value&#xff0c;且无重复 sadd / smembers / sismember / srem / scard srandmember / spop smove 集合运算 应用场景 3.6 Redis有序集合Zset&#xff08;sorted set&#xff09; 有序有重复 zadd / zrange …

计算机设计大赛 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…