指针的学习4

news/2024/4/13 12:28:07/文章来源:https://blog.csdn.net/2301_80802299/article/details/136479393

目录

回调函数

qsort使用样例

使用qsort函数排序整形数据

使用qsort函数排序结构体


回调函数

回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行相应(是一种机制)

qsort使用样例

使用qsort函数排序整形数据

qsort——库函数,直接用来排序数据,底层使用的是快速排序的方式

冒泡排序:

#include <stdio.h>
void bubble_sort(int arr[], int sz)//只能进行整形排序
{for (int i = 0; i < sz - 1; i++){//趟数for (int j = 0; j < sz - i - 1; j++)////一趟内部的排序{if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
void print_arr(int arr[], int sz)
{for (int i = 0; i < sz; i++)//{printf("%d ", arr[i]);}
}
int main()
{//写一个冒泡排序的函数,对一组整形数据进行排序,排序为升序int arr[] = { 9,8,7,6,5,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr,sz);print_arr(arr, sz);return 0;
}

冒泡排序只能用来实现对一种类型数据的排序

qsort可以实现对任意类型的数据进行排序

void qsort(void* base,//指向的是待排序的数组的第一个元素size_t num,//base指向的数组里面的元素个数size_t size,//base指向的数组中元素的大小int (*compar)(const void*, const void*));//函数指针
//4个参数

那么,要想使冒泡排序能够排序任意类型数据,应该怎样改造呢?

两个整型元素可以使用>进行比较,但是两个字符串、两个结构体元素不能够用>进行比较

两个字符串用strcmp进行比较

void bubble_sort(int arr[], int sz)//只能进行整形排序
{for (int i = 0; i < sz - 1; i++){//趟数for (int j = 0; j < sz - i - 1; j++)////一趟内部的排序{if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}

中间无非是两个元素进行比较,可以封装成函数,然后把函数的地址传给排序函数

而qsort函数就是这样进行排序的:

void qsort(void* base,//指向的是待排序的数组的第一个元素size_t num,//base指向的数组里面的元素个数size_t size,//base指向的数组中元素的大小int (*compar)(const void*, const void*));//函数指针
//4个参数

这里的函数指针指向的就是两个元素的比较函数


//qsort函数有实现者
//qsort函数的使用者-明确的知道要排序的是什么数据,这些数据应该如何比较,所以提供两个元素的比较函数
int cmp_int(const void* p1, const void* p2)//存放待比较两个元素的地址
{//升序//void*类型的指针是无具体类型的指针,这种类型的指针不能直接解引用,也不能进行+-整数的运算return (*(int*)p1 - *(int*)p2);//同下//return (*(int*)p2 - *(int*)p1);降序/*if (*(int*)p1 > *(int*)p2)return 1;else if (*(int*)p1 == *(int*)p2)return 0;elsereturn -1;*/
}
void print_arr(int arr[], int sz)
{for (int i = 0; i < sz; i++)//{printf("%d ", arr[i]);}
}
void test()
{int arr[] = { 9,8,7,6,5,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_int);print_arr(arr, sz);}
int main()
{test();return 0;
}
使用qsort函数排序结构体

.和->都是结构体成员访问操作符

结构体变量.成员名

结构体指针->成员名

struct Stu
{char name[20];int age;
};
int main()
{struct Stu s = { "zhangsan",18 };printf("%s %d\n", s.name, s.age);return 0;
}

再看下面这段代码:

struct Stu
{char name[20];int age;
};
void print(struct Stu* ps)
{printf("%s %d\n", (*ps).name, (*ps).age);
}
int main()
{struct Stu s = { "zhangsan",18 };//printf("%s %d\n", s.name, s.age);print(&s);return 0;
}

很明显麻烦了!此时,可以这样写代码:

void print(struct Stu* ps)
{//printf("%s %d\n", (*ps).name, (*ps).age);printf("%s %d\n", ps->name, ps->age);//结构体指针的用法
}

struct Stu
{char name[20];int age;
}s,s1;//s,s1是结构体变量,是一样的
typedef struct Stu
{char name[20];int age;
}stu;//stu是类型名
struct Stu
{char name[20];int age;};
//这里的结构体怎么比较大小?
//1.按照名字比较-字符串比较strcmp
//2.按照年龄比较-整型比较
//按照需求比较
int cmp_stu_by_name(const void* p1, const void* p2)
{return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);//比较两个字符串-按照对应字符串中字符的ASCII码值比较
}
void test()//对结构体进行排序
{struct Stu arr[3] = { {"zhangsan",20},{"lisi",18} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr,sz,sizeof(arr[0]),cmp_stu_by_name);}
int main()
{test();return 0;
}

我们模仿qsort来实现一个冒泡排序的函数,这个函数可以对任意类型数据进行排序


int cmp_int(const void* p1, const void* p2)//存放待比较两个元素的地址
{//升序//void*类型的指针是无具体类型的指针,这种类型的指针不能直接解引用,也不能进行+-整数的运算return (*(int*)p1 - *(int*)p2);
}void Swap(char* buf1,char* buf2,size_t width)//交换
{for (int i = 0; i < width; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}
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 - i - 1; j++)////一趟内部的排序{//比较arr[j]和arr[j+1]if (cmp((char*)base+j*width,(char*)base+(j+1)*width)>0){//交换两个元素Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);}}}
}
void print_arr(int arr[], int sz)
{for (int i = 0; i < sz; i++)//{printf("%d ", arr[i]);}
}
void test()
{int arr[] = { 2,1,4,3,5,6,7,8,9 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);//排序整型//bubble_sort(arr2, );//排序结构体print_arr(arr, sz);
}int main()
{test();return 0;
}

注意:这个代码是迄今为止最复杂的一个代码!!!

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

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

相关文章

35 Spring整合Elasticsearch

文章目录 Spring整合Elasticsearch引入依赖配置Elasticsearch解决冲突 使用ElasticsearchSpring Data Elasticsearch建立映射关系常用方法添加数据修改数据删除数据搜索数据&#xff08;es核心&#xff09;步骤构造搜索条件 并 应用进行查询使用查询结果 Spring整合Elasticsear…

设计模式2--Abstract Factory Design Pattern In C++

1.AFDP&#xff08;抽象工厂设计模式&#xff09; AFDP 定义了一个抽象类来创建相关的家族对象但未指定其具体子类 2.基本原理图 3.为什么/何时使用AFDP 1.你需要系统独立于对象的创建、组合和表示方式。 2.显示接口而不是实现。 3.系统需要配置多个对象系列之一 4.UML图 5…

安卓部分手机使用webview加载链接后白屏(Android低版本会出现的问题)

前言 大爷&#xff1a;小伙我这手机怎么打开你们呢这个是白屏什么都不显示。 大娘&#xff1a;小伙我这也是打开你们呢这功能&#xff0c;就是一个白屏什么也没有&#xff0c;你们呢的应用不会有病毒吧。 小伙&#xff1a;我的手机也正常&#xff1b; 同事&#xff1a;我的也正…

Docker容器化解决方案(镜像,容器的操作管理)

Docker镜像管理 搜索官方仓库镜像 docker search [rootlocalhost ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx Official build of Nginx. …

【位运算】【左右位移】Leetcode 2917. 找出数组中的 K-or 值

【位运算】【左右位移】Leetcode 2917. 找出数组中的 K-or 值 解法 位运算 ---------------&#x1f388;&#x1f388;题目链接 2917. 找出数组中的 K-or 值&#x1f388;&#x1f388;------------------- 【1】<<&#xff1a;左位移运算符 符号位不变&#xff0c;低…

网络编程的学习

思维导图 多路复用代码练习 select完成TCP并发服务器 #include<myhead.h> #define SER_IP "192.168.125.73" //服务器IP #define SER_PORT 8888 //服务器端口号int main(int argc, const char *argv[]) {//1、创建用于监听的套接字int sfd -1;s…

基于GPT-SoVITS少样本语音转换的实时交互TTS

项目地址&#xff1a;https://github.com/DLW3D/GPT-SoVITS 该项目基于 RVC-Boss/GPT-SoVITS-WebUI 前言 GPT-SoVITS-WebUI 实现了使用WebUI的简易小样本语音模拟和文本转语音所需的完整流程&#xff0c;包括数据清洗、文本标注、模型微调、文本转语音。 该项目是对 GPT-SoVI…

动态规划课堂3-----简单多状态问题(买卖股票最佳时机)

目录 引入&#xff1a; 例题1&#xff1a;按摩师&#xff08;打家劫舍I&#xff09; 例题2&#xff1a;打家劫舍II 例题3&#xff1a;删除并获得点数 例题4&#xff1a;粉刷房子 例题5&#xff1a;买卖股票的最佳时机含冷冻 结语&#xff1a; 引入&#xff1a; 相信看到…

uniapp+vue3+vites使用lime-echart问题记录

问题记录 1.vue3使用echarts,H5和微信小程序兼容问题 1.vue3使用echarts,H5和微信小程序兼容问题 问题描述&#xff0c;正常使用echarts&#xff0c;H5正常&#xff0c;小程序报错 报错信息如下 解决方案&#xff1a; 注意要点一&#xff1a;vue3需要使用esm文件 地址&#x…

在ubuntu上安装hadoop完分布式

准备工作 Xshell安装包 Xftp7安装包 虚拟机安装包 Ubuntu镜像源文件 Hadoop包 Java包 一、安装虚拟机 创建ubuntu系统 完成之后会弹出一个新的窗口 跑完之后会重启一下 按住首先用ctrlaltf3进入命令界面&#xff0c;输入root&#xff0c;密码登录管理员账号 按Esc 然后输入 …

解决/sys/kernel/debug/下没有任何文件的

问题&#xff1a; /sys/kernel/debug目录下没有任何信息 解决&#xff1a; 首先检查Debug Filesystem是否选中&#xff0c;其位置是&#xff1a; Kernel hacking -> Compile-time checks and compiler options -> Debug Filesystem 打开configs文件查看是否为y: arch/arm…

2024全国水科技大会之国际合作与新技术、新产品推介会

召集人&#xff1a;中华环保联合会水环境治理专委会 此论坛主要为筛选新技术、新产品&#xff0c;入选企业后续可参与到我会7月的国际考察中&#xff0c;可为企业推荐国际项目合作&#xff01; 一、会议背景 为积极应对“十四五”期间我国生态环境治理面临的挑战&#xff0c;加…

栈【stack】 栈的【STL】运用 【单调栈】 【单调栈】的详细解释【图文讲解】 洛谷P5788 【模板】单调栈 【单调队列】

文章目录 栈的定义栈的STL运用 单调栈 & 单调队列单调栈的详细解释【图文讲解】例题&#xff1a;洛谷P5788 【模板】单调栈code↓洛谷P5788 【模板】单调栈 AC 栈的定义 栈的修改与访问是按照后进先出的原则进行的 栈通常被称为是后进先出&#xff08;last in first out&…

【深度学习笔记】优化算法——随机梯度下降

随机梯度下降 在前面的章节中&#xff0c;我们一直在训练过程中使用随机梯度下降&#xff0c;但没有解释它为什么起作用。为了澄清这一点&#xff0c;我们刚在 :numref:sec_gd中描述了梯度下降的基本原则。本节继续更详细地说明随机梯度下降&#xff08;stochastic gradient d…

2024年【安全员-C证】找解析及安全员-C证模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证找解析是安全生产模拟考试一点通总题库中生成的一套安全员-C证模拟考试&#xff0c;安全生产模拟考试一点通上安全员-C证作业手机同步练习。2024年【安全员-C证】找解析及安全员-C证模拟考试 1、【多选题】…

【解决】虚幻导入FBX模型不是一个整体

问题&#xff1a; 现在有一个汽车的fbx模型&#xff0c;导入虚幻引擎&#xff0c;导入后变成了很多汽车零件模型。 解决&#xff1a; 把“合并网格体”勾选上&#xff0c;解决问题。

STM32各外设初始化步骤

1、GPIO初始化步骤 1、使能GPIO时钟 2、初始化GPIO的输入/输出模式 3、设置GPIO的输出值或获取GPIO的输入值 GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin…

JavaScript基础Ⅱ

目录 第2章 JavaScript基础语法(掌握) 11-JS代码调试 12-JS函数 第3章 JS事件 14-事件的绑定方式 常用事件(了解) 15-常用事件 第4章 JS内置对象(掌握) 16-数组 17-日期 18-数学运算 19-数字 20-全局函数 第2章 JavaScript基础语法(掌握) 11-JS代码调试 12-JS函数…

Kosmos-1: 通用接口架构下的多模态大语言模型

Kosmos-1: 通用接口架构下的多模态大语言模型 FesianXu 20230513 at Baidu Search Team 前言 在大规模语言模型&#xff08;Large Language Model, LLM&#xff09;看似要带来新一番人工智能变革浪潮之际&#xff0c;越来越多尝试以LLM作为通用接口去融入各种任务的工作&#…

Git实战(1)

一, git log 查看提交日志情况 根据 commitId进行版本回退 git reset --hard commitId(commitId可以是一部分,不用完整的ID) 只输出一行信息: git log --pretty=oneline 快速回退: git reset --hard HEAD^ 回退到上一个版本 git reset --hard HEAD^^ 回退到上上个版本 如果…