初识指针(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.mzph.cn/web/11322.shtml

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

相关文章

深度学习知识点全面总结

ChatGPT 深度学习是一种使用神经网络来模拟人脑处理数据和创建模式的机器学习方法。下面是深度学习的一些主要知识点的总结&#xff1a; 1. 神经网络基础&#xff1a; - 神经元&#xff1a;基本的计算单元&#xff0c;模拟人脑神经元。 - 激活函数&#xff1a;用于增加神…

【CSP CCF记录】数组推导

题目 过程 思路 每次输入一个Bi即可确定一个Ai值&#xff0c;用temp记录1~B[i-1]&#xff0c;的最大值分为两种情况&#xff1a; 当temp不等于Bi时&#xff0c;则说明Bi值之前未出现过&#xff0c;Ai必须等于Bi才能满足Bi是Ai前缀最大的定义。当temp等于Bi时&#xff0c;则说…

SpringAMQP-消息转换器

这边发送消息接收消息默认是jdk的序列化方式&#xff0c;发送到服务器是以字节码的形式&#xff0c;我们看不懂也很占内存&#xff0c;所以我们要手动设置一下 我这边设置成json的序列化方式&#xff0c;注意发送方和接收方的序列化方式要保持一致 不然回报错。 引入依赖&#…

重磅推出:135届广交会采购商名录,囊括28个行业数据!

5.5日&#xff0c;第135届中国进出口商品交易会&#xff08;简称广交会&#xff09;在广州圆满闭幕&#xff0c;这一全球贸易盛典再次展现了中国制造的卓越实力和文化魅力&#xff0c;成就斐然&#xff0c;吸引了全球目光。 本届广交会线下出口成交额达247亿美元&#xff0c;对…

项目-坦克大战-让坦克动起来

为什么写这个项目 好玩涉及到java各个方面的技术 1&#xff0c;java面向对象 2&#xff0c;多线程 3&#xff0c;文件i/o操作 4&#xff0c;数据库巩固知识 java绘图坐标体系 坐标体系-介绍 坐标体系-像素 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的像素是一…

详细解读字节跳动视频生成模型StoryDiffusion:连环画创作和长视频生成

Diffusion Models专栏文章汇总:入门与实战 前言:最近字节跳动提出了一项关于特征一致图像生成的工作StoryDiffusion,可以生成一系列特征主题相关的图像,还可以扩展成具有时间一致性的帧序列,从而组成长视频。这篇博客火速解读这篇最新的工作,包括论文和代码。 目录 贡献…

安卓开发问题:安卓Ble出现动态鉴权失败以及扫描设备一直进入不了回调函数的问题

问题1描述 1、安卓12需要动态鉴权 // 鉴权函数 requestPermissions(permissionsList.toArray(strings), MyConstants.REQUEST_CODE_PERMISSIONS);但是在鉴权回调函数中如Manifest.permission.BLUETOOTH_SCAN、Manifest.permission.BLUETOOTH_CONNECT一直显示失败&…

力扣HOT100 - 70. 爬楼梯

解题思路&#xff1a; 动态规划 注意 if 判断和 for 循环 class Solution {public int climbStairs(int n) {if (n < 2) return n;int[] dp new int[n 1];dp[1] 1;dp[2] 2;for (int i 3; i < n; i) {dp[i] dp[i - 1] dp[i - 2];}return dp[n];} }

设计模式-10 - Memento Design Pattern

设计模式-10 - Memento Design Pattern 1.定义 备忘录模式是一种设计模式&#xff0c;它允许在不破坏封装性的情况下捕获和恢复对象的内部状态。 其结构&#xff1a; Originator&#xff1a;创建和管理备忘录的对象。 Memento&#xff1a;存储 Originator 状态的备忘录对象…

品牌设计理念和logo设计方法

一 品牌设计的目的 设计是为了传播&#xff0c;让传播速度更快&#xff0c;传播效率更高&#xff0c;减少宣传成本 二 什么是好的品牌设计 好的设计是为了让消费者更容易看懂、记住的设计&#xff0c; 从而辅助传播&#xff0c; 即 看得懂、记得住。 1 看得懂 就是让别人看懂…

树莓派|采集视频并实时显示画面

1、使用SSH远程连接到树莓派 2、新建存放代码的目录 mkdir /home/pi/my_code_directory 3、进入存放代码的目录 cd /home/pi/my_code_directory 4、新建py文件 nano cv2test.py 5、输入代码 import cv2# 打开摄像头 cap cv2.VideoCapture(0)while True:# 读取视频帧ret…

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

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

mysql 幻读,脏读和不可重复读

MySQL的脏读、幻读和不可重复读是数据库事务处理中的三种常见问题&#xff0c;它们都涉及到数据的一致性和并发性。一&#xff0c;脏读 脏读是指一个事务读取了另一个事务未提交的数据。这可能导致数据不一致的问题。 例如&#xff1a; 用户user1的初始balance是100&#xff0…

java项目之智慧图书管理系统设计与实现(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的智慧图书管理系统设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 智慧图书管理…

SOCKET编程(5):IO复用

IO复用 多进程/线程并发模型&#xff0c;为每个sockets分配一个进程/线程 I/O&#xff08;多路&#xff09;复用&#xff0c;采用单个进/线程就可以管理多个socket I/O复用有3种方案&#xff1a; selectpollepoll select I/O多路复用详解 27、fd_set与FD_SETSIZE详解 详解…

新闻资讯微信小程序开发后端+php【附源码,文档说明】

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

管理科学SCI、SSCI双检索,自引率低,无预警风险,对国人相当友好!

一、期刊名称 Journal of Organizational and End User Computing 二、期刊简介概况 期刊类型&#xff1a;SSCI 学科领域&#xff1a;管理学 影响因子&#xff1a;6.5 中科院分区&#xff1a;2区 出版方式&#xff1a;开放出版 版面费&#xff1a;$3300 三、期刊征稿范围…

探秘钱塘高中,筑梦未来之旅————杭州市钱塘高级中学

晨曦微露&#xff0c;书生琅琅&#xff0c;古韵今风交织在这方学府&#xff0c;滔滔的钱塘江畔&#xff0c;杭州市钱塘高级中学屹立于此。这所学校自1958年建校伊始&#xff0c;走过几十年的光辉岁月&#xff0c;一直致力于提供优质的教育资源。 近年来&#xff0c;学校获得多项…

Learning C# Programming with Unity 3D

作者&#xff1a;Alex Okita 源码地址&#xff1a;GitHub - badkangaroo/UnityProjects: A repo for all of the projects found in the book. 全书 686 页。

Java常见数据结构---八大结构

前言&#xff1a; 数据结构是计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。 通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率 常见的八大数据结构&#xff1a; 栈&#xff1a; 思想&#xff1a; 栈是一种数据结构&…