初识指针(5)<C语言>

前言

        在前几篇文章中,已经介绍了指针一些基本概念、用途和一些不同类型的指针,下文将介绍某些指针类型的运用。本文主要介绍函数指针数组、转移表(函数指针的用途)、回调函数、qsort使用举例等。


函数指针数组

        函数指针数组即每个元素都是函数地址的数组。

//函数指针数组
int jia(int x, int y) {//加法函数return x + y;
}
int jian(int x, int y) {//减法函数return x - y;
}
int cheng(int x, int y) {//乘法函数return x * y;
}
int chu(int x, int y) {//除法函数return x / y;
}
int main() {int (*p[4]) (int, int) = {jia,jian,cheng,chu};//保证p与[]先结合成数组,之后再与*结合,构成指针数组,最后再和函数结合return 0;
}

 转移表(函数指针的用途)

        假如我们写个程序完成对两个数之间的简单数学运算(加减乘除),按照正常的写法,选择一种计算后进入判断环节,之后再输入数字,这样写每一种运算下都会有代码重复,有没有办法简化代码呢?


回调函数

        即一个通过函数指针调用的函数。

        通过回调函数,可以消除特定场景中因为多分支造成的重复代码,例如:一个实现加减乘除的程序中,每个分支下都有一种运算,每个运算可写成一个函数,我们可以再写一个函数将每种分支下的重复代码包含进去,通过传入函数指针来调用运算函数,从而完成运算。

//回调函数
int jia(int x, int y) {return x + y;
}
int jian(int x, int y) {return x - y;
}
int cheng(int x, int y) {return x * y;
}
int chu(int x, int y) {return x / y;
}
void menu() {printf("**********************\n");printf("***1.加法   2.减法****\n");printf("***3.乘法   4.除法****\n");printf("***    0.exit     ****\n");printf("**********************\n");
}
int hui(int(*p)(int, int)) {int x, y;printf("请输入操作数\n");scanf("%d%d", &x, &y);return p(x, y);
}
int main() {int i, x, y,ret;do {menu();printf("请选择—>");scanf("%d", &i);switch (i) {case 1:ret = hui(jia);printf("%d\n", ret);break;case 2:ret = hui(jian);printf("%d\n", ret);break;case 3:ret = hui(cheng);printf("%d\n", ret);break;case 4:ret = hui(chu);printf("%d\n", ret);break;case 0:printf("退出计算\n");break;default:printf("输入错误,重新输入\n");break;}} while (i);return 0;
}

qsort使用举例

        qsort函数是C语言的库函数,包含在<stdlib.h>头文件中,它可用于对所有数据类型进行排序,包括结构体,使用这个库函数,必须再写个比较元素的函数,返回int型(大于0:大于、等于0:等于、小于0:小于),默认升序,如要进行逆序输出,则在比较函数中,交换操作数的位置。

排序整型数组
//qsort函数,排序整型数组
#include<stdio.h>
#include<stdlib.h>
int  intcmp (const void* p1, const void* p2) {//比较函数,两个元素的比较return (*(int*)p1) - (*(int*)p2);
}
int main() {int arr[6] = { 3,6,2,0,3,8 };int sz = sizeof(arr) / sizeof(arr[1]);qsort(arr,//数据类型void*base,用于接受待排序的数组的数组名,也就是首元素的地址sz,//数据类型sizeof_t,待排序数组的元素个数sizeof(arr[0]),//数据类型sizeof_t,待排序数组元素字节大小intcmp);
//数据类型 int(*) (const void*,const void*),用于接收俩个元素比较的函数,
//返回值:大于0(表示大于),等于0(等于),小于0(小于)for (int i = 0; i < sz; i++) {printf("%d ", arr[i]);}return 0;
}

运行结果:

排序结构体

按字符排

//qsort函数,结构体
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu {char name[100];int  age;int  height;
};
int namecmp(const void* p1, const void* p2) {//按名称排return strcmp((*(struct stu*)p1).name, (*(struct stu*)p2).name);
}
int main() {struct stu arr[] = { {"zk",18,163},{"tian",19,180},{"xing",17,170} };int sz = sizeof(arr) / sizeof(arr[1]);qsort(arr,sz,sizeof(arr[0]),namecmp);for (int i = 0; i < sz; i++) {printf("%s %d %d\n", arr[i].name, arr[i].age, arr[i].height);}return 0;
}

运行结果

 按照整形排

//qsort函数,结构体
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu {char name[100];int  age;int  height;
};
//int namecmp(const void* p1, const void* p2) {//按名称排
//	return strcmp((*(struct stu*)p1).name, (*(struct stu*)p2).name);
//}
int agecmp(const void* p1, const void* p2) {//按照年龄排return (*(struct stu*)p1).age - (*(struct stu*)p2).age;
}
int main() {struct stu arr[] = { {"zk",18,163},{"tian",19,180},{"xing",17,170} };int sz = sizeof(arr) / sizeof(arr[1]);qsort(arr,sz,sizeof(arr[0]),agecmp);for (int i = 0; i < sz; i++) {printf("%s %d %d\n", arr[i].name, arr[i].age, arr[i].height);}return 0;
}

 运行结果

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

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

相关文章

探索国外静态IP:跨境网络的基石

在数字化时代&#xff0c;互联网已经成为我们生活和工作的重要部分。无论是远程办公、在线教育还是跨境电商&#xff0c;稳定的网络连接都至关重要。而在这个过程中&#xff0c;国外静态IP以其独特的优势&#xff0c;成为了许多企业和个人用户的选择。 一、国外静态IP的应用场景…

排序-快速排序(Quick Sort)

快排的简介 快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;采用分治法的策略&#xff0c;其基本思想是选择一个基准元素&#xff0c;通过一趟排序将待排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据要…

ViewModel 完全指南:实践与背后原理全解

一、引言 在现代Android应用开发中&#xff0c;处理UI数据的有效管理和状态保持是开发者面临的重要挑战之一。Google推出的Jetpack组件库中的ViewModel已成为解决这些问题的关键工具。ViewModel旨在以生命周期意识的方式存储和管理界面相关的数据&#xff0c;从而使数据在配置…

从iconfont引入线上字体库

如果是长期使用建议直接下载字体包 /* 在线链接服务仅供平台体验和调试使用&#xff0c;平台不承诺服务的稳定性&#xff0c;企业客户需下载字体包自行发布使用并做好备份。 */ 例如使用阿里妈妈数黑体 https://www.iconfont.cn/fonts/detail?spma313x.fonts_index.i1.d9df…

福建建设工程造价信息网2023年1至12月工程材料信息价期刊汇总

福建省最新造价信息网工程材料信息价期刊可打开 www.zgjct.com 直接下载,历年造价信息期刊也可查询,所有材料信息价格都由官方发布,如有疑问可咨询网站人工客服微信 造价信息期刊更新明细如下&#xff1a; 福州市造价信息网各类工程信息价期刊下载 福州市工程材料信息价2023年…

在全志H616核桃派开发板上进行PyQt5的代码编写和运行

核桃派本地 在上一节我们通过Qt Designer设计了ui窗口并转换成了Python代码&#xff0c;由于是Python编程&#xff0c;因此我们可以在核桃派开发板打开Python代码进行编程。 在核桃派上推荐使用Thonny来打开编写Python文件, 使用请参考&#xff1a;Thonny IDE。 打开上一节生…

BGP学习二:BGP通告原则,BGP反射器,BGP路径属性细致讲解,新手小白无负担

目录 一.AS号 二.BGP路由生成 1.network 2.import-route引入 三.BGP通告原则 1.只发布最优且有效的路由 2.从EBGP获取的路由&#xff0c;会发布给所有对等体 3.水平分割原则 4.IBGP学习BGP默认不发送给EBGP&#xff0c;但如果也从IGP学习到了这条路由&#xff0c;就发…

乡村振兴与乡村旅游深度融合:依托乡村自然和文化资源,发展乡村旅游产业,促进农民增收致富,打造特色美丽乡村

目录 一、引言 二、乡村振兴与乡村旅游的内在联系 三、依托乡村自然和文化资源发展乡村旅游产业 &#xff08;一&#xff09;挖掘乡村自然资源优势&#xff0c;打造特色旅游品牌 &#xff08;二&#xff09;挖掘乡村文化资源内涵&#xff0c;丰富旅游活动内容 四、促进农…

PG的事务ID回卷逻辑

PG到目前为止使用的事务ID仍然是32位的&#xff0c;在内存计算时虽然已经使用64位事务ID&#xff0c;但是存储在页中tuple仍然使用32位事务ID&#xff0c;这就是说&#xff0c;事务ID回卷仍然是必须处理的问题。 所谓PG事务ID回卷&#xff0c;简单地说&#xff0c;就是在数据库…

网页版五子棋的自动化测试

目录 前言 一、主要技术 二、测试环境的准备部署 三、测试用例 四、执行测试 4.1、公共类设计 创建浏览器驱动对象 测试套件 释放驱动类 4.2、功能测试 登录页面 注册页面 游戏大厅页面 游戏房间页面 测试套件结果 4.3、界面测试 登录页面 注册页面 游戏大…

python如何单步调试

Python怎么单步调试&#xff1f;下面给大家介绍一下单步调试&#xff1a; 方法一&#xff1a;执行 python -m pdb myscript.py (Pdb) 会自己主动停在第一行。等待调试&#xff0c;这时你能够看看帮助。 方法二&#xff1a;在所调试程序的开头中&#xff1a;import pdb 并在你…

Vue入门到关门之Vue3学习

一、常用API 注意&#xff1a;本文项目均使用脚手架为 Vite 1、setup函数 &#xff08;1&#xff09;介绍 如果在项目中使用配置项API&#xff0c;那么写起来就和vue2的写法是一样的&#xff1b;但是如果在项目中写的是组合式API&#xff0c;那么组件中所用到的&#xff1a…