指针进阶详解续---C语言

news2024/10/6 10:26:35

❤博主CSDN:啊苏要学习

  ▶专栏分类:C语言◀

  C语言的学习,是为我们今后学习其它语言打好基础,C生万物!

  开始我们的C语言之旅吧!✈

目录

前言:

一.函数指针数组

二.指向函数指针数组的指针

三.回调函数

四.学习qsort


前言:

  上一篇我们讲了函数指针,这篇是函数指针数组等更多内容,最后我们学习一下qsort的使用,加强我们对函数指针的理解。

一.函数指针数组

  整型数组,是以整型为元素的数组,类似的,函数指针数组是存放函数指针的数组

  当我们拿到函数的地址,就能通过其地址调用该函数,现将多个函数地址存到数组里,实现一个计算器:

void menu()
{
	printf("****************************\n");
	printf("******* 1. Add 2. Sub ******\n");
	printf("******* 3. Mul 4. Div ******\n");
	printf("******* 0. Exit       ******\n");
	printf("****************************\n");
}
int main()
{
	int input = 0;
	int x = 0, y = 0, ret = 0;
	//第一个用NULL挤位置
	int(*pfarr[5])(int, int) = { NULL, Add, Sub, Mul, Div };
	do
	{
		menu();
		printf("请输入:>");
		scanf("%d", &input);
		if (input == 0)
		{
			printf("退出计算器\n");
			break;
		}
		else if (input >= 1 && input <= 4)
		{
			printf("请输入两个数:>");
			scanf("%d %d", &x, &y);
			ret = pfarr[input](x, y);
			printf("ret = %d\n", ret);
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	} while (input);
	return 0;
}

  Add这些函数没打在代码里,读者知道即可,函数指针数组的存在,让一些代码变得很简洁。

  在以后如果需要添加新的计算方法,可以把函数指针加到数组中,改一改就可以正常使用啦。

二.指向函数指针数组的指针

  函数指针数组也是一个数组,也可以取地址,取出来的地址就可以存放到一个指针里,这个指针就叫函数指针数组的指针。

  之后的指针也可以放到数组里,就这样套娃,当然我们也不一定会用到,但我们要学,要知道,要会。

  这里我们来练习一个如何快速且正确写出类型:

int Add(int x, int y);
int main()
{
    //函数指针
    int(*pf)(int, int) = Add;
    
    //函数指针数组
    //1.把函数指针类型先搬下来
    //2.数组的话直接加[]
    int(*pfarr[5])(int, int) = {Add};

    //函数指针数组的指针
    //1.把函数指针数组类型搬下来
    //2.指针要加一颗*并用()包起来
    int(* (*ppfarr)[5])(int, int) = &pfarr;
    //注意:不能直接这样int((*ppfarr)[5])(int, int)
    //第一颗星是函数指针类型的 int(*)(int, int);
    return 0;
}

三.回调函数

  当A函数的地址作为参数传参给B函数,B函数使用这个地址调用A函数,A函数就是回调函数。
  回调函数不是实现方直接调用的,而是在特定条件发生时,由另一方调用,用来对该条件进行响应。

  函数指针的一个非常大的用途就是实现回调函数,回调函数的实现离不开函数指针的支持

void Calc(int (*pf)(int, int))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("请输入两个数:>");
	scanf("%d %d", &x, &y);
	ret = pf(x, y);
	printf("ret = %d\n", ret);
}

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请输入:>");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("退出计算器\n");
			break;
		case 1:
			Calc(Add);
			break;
		case 2:
			Calc(Sub);
			break;
		case 3:
			Calc(Mul);
			break;
		case 4:
			Calc(Div);
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

  这次使用函数指针方式实现这个计算器,Calc是一个函数,它的参数是一个函数指针,这样Calc就可以具有多个函数的功能

  当我们需要Calc实现什么功能,把对应函数的地址传进去,在Calc里面到特定的时候调用,这个通过函数指针调用的函数就叫回调函数。

四.学习qsort

  q是quick的意思,qsort--快排。和以前实现的bubble_sort相比,抛开效率这一点,冒泡排序只能实现整数的排序

  而qsort可以实现任意类型数据的排序,我们先查查文档,学习了解qsort如何使用,再模拟实现。

  qsort是排序被base指向的数组里的num个元素,每个元素大小为size,比较的方法通过函数指针传参进去。

  compar比较,p1是数组里a元素的地址,p2是数组里b元素的地址,如果p1指向的元素大于p2指向的,返回大于0的数;以及另外两种情况。

  void*是无类型的指针,它可以接收任意数据类型的地址,但是不能对它解引用或指针加减运算,可以先强制类型转换再使用

  base数组和cmp参数设置成void*的目的是让函数能够具有普遍性

使用者可能传一个整型数组,也可能传一个浮点型数组,比较的元素也可能是不确定的,设置成空类型,就都可以接收而不会报警告。

  对结构体中的字符串进行比较,上图是还未排序前的顺序,根据字母ASCII码值的大小排序应是:fa->hong->li->san

  好啦,qsort如何使用也学完了,我们下篇就使用冒泡排序代替快速排序模拟实现一个可以排序任意类型的bsort

结语:希望读者读完有所收获!在学C的路上,祝福我们能越来越C!✔

  读者对本文不理解的地方,或是发现文章在内容上有误等,请在下方评论区留言告诉博主哟~,也可以对博主提出一些文章改进的建议,感激不尽!最后的最后!

  ❤求点赞,求关注,你的点赞是我更新的动力,一起努力进步吧。

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

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

相关文章

3D WEB轻量化渲染引擎Communicator发布冲突检测库!增加客户端和服务器端冲突检测功能

​HOOPS Communicator是Tech Soft 3D旗下的主流产品之一&#xff0c;具有强大的、专用的高性能图形内核&#xff0c;专注于基于Web的高级3D工程应用程序。其由HOOPS Server和HOOPS Web Viewer两大部分组成&#xff0c;提供了HOOPS Convertrer、Data Authoring的模型转换和编辑工…

【Java练习题汇总】《第一行代码JAVA》综合测试二,汇总Java练习题

Java练习题 综合测试二 1️⃣ 综合测试二 1️⃣ 综合测试二 下面( )不属于面向对象的特点。 A. 封装 B. 转型 C. 继承 D. 多态 下面关于类与对象的描述正确的是( )。 A. 任何情况下必须先有类再有对象&#xff0c;对象只能够调用类中定义的方法&#xff0c;不能够调用属性 B.…

大家知道AI智能绘画是什么吗?我将为你解答

最近&#xff0c;我经常看到朋友在朋友圈上一直发美女图&#xff0c;我在想“这小子现在怎么回事&#xff0c;天天发女孩子的图片”。 便去询问了一下&#xff0c;他却笑着对我说&#xff1b;“这些都不是真人&#xff0c;是我ai智能绘画出图的”。 顿时&#xff0c;我就有点懵…

详细谈谈AIO、BIO、NIO 的区别

目录 一、什么是AIO 二、什么是BIO 三、什么是NIO 四、NIO 在 Netty 中的使用 一、什么是AIO AIO&#xff08;Asynchronous I/O&#xff0c;异步输入输出&#xff09;是一种处理输入输出的编程模型&#xff0c;它允许同时处理多个输入输出操作&#xff0c;而不需要等待每个…

Activity的自启动模式

以下内容摘自郭霖《第一行代码》第三版 文章目录 Activity的自启动模式1.standard&#xff08;默认&#xff09;2.singleTop3.singleTask4.singleInstance Activity的自启动模式 启动模式一共有4种&#xff0c;分别是standard、singleTop、singleTask和singleInstance&#x…

java: MultiValueMap

实际就是value为List的map.在较早版本(比如2.3.7)的spring boot 的loadSpringFacotories方法中有使用&#xff0c; 新版本(比如2.6.6&#xff09;已换成Map<String,List> MultiValueMap用法很简单&#xff1a;

资产盘点流程及注意事项

公司在引进固定资产管理的同时&#xff0c;也广泛加快了信息化工作的进程。现代计算机技术、条码技术、条码技术等都不能满足传统的固资管理机制&#xff0c;RFID技术、硬件扫描技术、提高固定资产管理流程、固定资产管理和统计等方面的特殊要求。科学规范地管控企业有形资产的…

日常环境配置

pip install 使用代理 例&#xff1a;代理端口&#xff1a;10808 pip install akshare --proxyhttp://127.0.0.1:10808———— conda 虚拟环境安装pip包 查看虚拟环境地址 conda info --env #查看虚拟环境地址使用–taget 安装pip 包 pip install akshare --target &q…

DataSphere Studio - 1.1.0安装部署 (单机版)

不要采用这种安装方式&#xff01;&#xff01;全部服务启动成功&#xff0c;不报错。页面还是各种报错&#xff0c;效率非常低下。 感谢微信群各位大佬帮助&#xff0c;分享了社区优秀文章中一键自动化部署脚本。 喝咖啡&#xff0c;自动部署&#xff0c;课本上故事成真。 自…

ChatGLM-6B模型使用

一、创建环境 conda create -n chatglm python3.8 conda activate chatglm 二、下载代码 git clone https://github.com/THUDM/ChatGLM-6B.git三、安装依赖 我这里是cuda11.2&#xff0c;根据自己的版本安装&#xff0c;这里是pytorch版本&#xff1a;https://pytorch.org/g…

linux系统编程重点复习--文件和目录操作

目录 复习目标 1.文件IO 2.C标准函数与系统函数的区别 2.1什么是系统调用 2.2 文件描述符 2.3 open函数 2.4 close函数 2.5 read/write 2.5.1read函数 2.5.2 write 2.6 lseek 2.7 perror和errno 2.8 阻塞和非阻塞: 3文件和目录 3.1 stat/lstat函数 3.2 opendir…

在使用Python爬虫时遇到解析错误解决办法汇总

在进行Python爬虫任务时&#xff0c;遇到解析错误是常见的问题之一。解析错误可能是由于网页结构变化、编码问题、XPath选择器错误等原因导致的。为了帮助您解决这个问题&#xff0c;本文将提供一些实用的解决办法&#xff0c;并给出相关的代码示例&#xff0c;希望对您的爬虫任…

【好书推荐】ChatGPT入门经典《这就是 ChatGPT》

文章目录 一、前言二、通俗易懂三、传奇大佬四、精彩的导读序五、总结 一、前言 目前很少能有一本书&#xff0c;能做到一定深度地普及 ChatGPT 的原理&#xff0c;而这本书可以做到恰到好处地告诉大家&#xff0c;ChatGPT 是如何工作的。 二、通俗易懂 ChatGPT 是一种人工智…

PCB制版技术

1、在头脑里形成一个原理图----现在就下载AD9盖版&#xff0c;诞生了一个问题&#xff0c;电路板去哪里买&#xff0c;买了怎么焊接电路和芯片&#xff0c;怎样流程化批量制作电子产品 1.1 形成一个PCB板&#xff0c;形成一个结构 1.2 焊接&#xff0c;嫁接&#xff0c;组装等 …

低功耗LCD液晶显示驱动厂家1621系列3线/4线接口可驱动32×4COM

型 号&#xff1a;VK1621 / 品 牌&#xff1a;VINKA/永嘉微电 最新年份 M1817 VK1621 是一个324的LCD驱动器&#xff0c;可软体程式控制使其适用于多样化的LCD应用线路&#xff0c;仅用到3至4条信号线便可控制LCD驱动器&#xff0c;除此之外也可介由指令使其進入省电模式 VK1…

Acwing.873.欧拉函数

题目 给定n个正整数ai&#xff0c;请你求出每个数的欧拉函数。 输入格式 第一行包含整数n。 接下来n行&#xff0c;每行包含一个正整数ai。 输出格式 输出共n行&#xff0c;每行输出一个正整数an的欧拉函数。 数据范围 1 ≤n ≤100 1≤ai≤2* 109 输入样例: 3 3 6 8输…

面试官:如何跟非技术人员解释黑盒、白盒、灰盒测试的区别?

​对于黑盒、白盒与灰盒测试方法的理解&#xff0c;几年前我在某乎做过一个概念性的回答&#xff0c;当时提问者询问&#xff1a;如何跟非技术人员解释黑盒、白盒、灰盒测试的区别&#xff1f; 我的回答原文如下&#xff1a; 既然是对非技术人员解释&#xff0c;就不能用专业…

绘制Circos基因圈图

写在前面 昨天在绘制Circos圈图&#xff0c;已经隔了2年左右没有做这类的图了。这时间过得真是快&#xff0c;但是文章和成果依旧是没有很明显的成效。只能安慰自己&#xff0c;后面的时间继续加油吧&#xff01;关于Cirocs图的制作&#xff0c;我从刚开始到现在都是是使用TBt…

PCB制版技术02

4.30 PCB库很重视它实际的尺寸和样子 4.31 PCB库很重视它实际的尺寸和样子&#xff0c;但是原理图就不需要了&#xff0c;我们只是在原理上做一个解释 4.32 我们习惯把角放在中央的位置 4.43 鼠标的右键可以取消选择的方框 4.44 放置引脚&#xff0c;连续击两下就出来了 4.45 …

从声通科技的发展来看,AI行业如何回答可持续盈利这一命题?

AI浪潮下&#xff0c;相关企业头顶新兴技术的光环&#xff0c;脚下是亏损的阴影。尽管业内不同企业身处不同的细分赛道&#xff0c;但是在巨大的成本支出面前&#xff0c;步伐还是有些难迈开。 当前&#xff0c;也有一些AI企业希望借助风口在更受投资者关注的舞台施展拳脚。据…