学C的第二十六天【指针的进阶(二)】

这篇具有很好参考价值的文章主要介绍了学C的第二十六天【指针的进阶(二)】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

=========================================================================

相关代码gitee自取:C语言学习日记: 加油努力 (gitee.com)

 =========================================================================

接上期

学C的第二十五天【指针的进阶(一)】_高高的胖子的博客-CSDN博客

 =========================================================================

                     

6 . 函数指针数组

(1). 含义:

函数指针数组 一个数组,是用于存放 函数指针数组

         

例如:

学C的第二十六天【指针的进阶(二)】,CCC全是C,c语言,c++

                

(2). 实例 -- 计算器(转移表的使用):

计算器加法减法乘法除法 各自定义为一个函数

因为返回int类型数据参数都是 两个整数

所以可以使用 函数指针数组 存储并调用这四个函数

           

(2.1). 未使用函数指针数组的效果:

自定义函数部分:

学C的第二十六天【指针的进阶(二)】,CCC全是C,c语言,c++

            

主函数部分:

学C的第二十六天【指针的进阶(二)】,CCC全是C,c语言,c++

               

对应代码:

//计算器:
#include <stdio.h>

//加法:
int Add(int x, int y)
{
	return x + y;
}
//减法:
int Sub(int x, int y)
{
	return x - y;
}
//乘法:
int Mul(int x, int y)
{
	return x * y;
}
//除法:
int Div(int x, int y)
{
	return x / y;
}

//菜单:
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; //计算的第一个数
	int y = 0; //计算的第二个数
	int ret = 0; //接收函数返回值

	do
	{
		menu();
		//从键盘输入:
		printf("请选择:>");
		scanf("%d", &input);

		//根据输入的数进行相应操作:
		switch (input)
		{ 
		case 1:
			//输入加法函数的两个参数:
			printf("请输入两个操作数:");
			scanf("%d %d", &x, &y);
			//调用加法函数:
			ret = Add(x, y);
			printf("计算结果为:%d\n", ret);
			break;
		case 2:
			//输入减法函数的两个参数:
			printf("请输入两个操作数:");
			scanf("%d %d", &x, &y);
			//调用减法函数:
			ret = Sub(x, y);
			printf("计算结果为:%d\n", ret);
			break;
		case 3:
			//输入乘法函数的两个参数:
			printf("请输入两个操作数:");
			scanf("%d %d", &x, &y);
			//调用乘法函数:
			ret = Mul(x, y);
			printf("计算结果为:%d\n", ret);
			break;
		case 4:
			//输入除法函数的两个参数:
			printf("请输入两个操作数:");
			scanf("%d %d", &x, &y);
			//调用除法函数:
			ret = Div(x, y);
			printf("计算结果为:%d\n", ret);
			break;
		case 0:
			printf("退出计算器\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}

	} while (input);//如果input为0则退出停止循环

	return 0;
}

                 

(2.2). 使用函数指针数组的效果 -- 转移表

             

转移表:通过函数指针数组的下标找到函数地址调用函数实现“跳转”的效果

              

自定义函数部分:

学C的第二十六天【指针的进阶(二)】,CCC全是C,c语言,c++

              

主函数部分:

减少代码冗余,之后添加算法只需要将添加添加函数加入 函数指针数组 再调整些参数即可

学C的第二十六天【指针的进阶(二)】,CCC全是C,c语言,c++

                   

对应代码:

//计算器:
#include <stdio.h>

//加法:
int Add(int x, int y)
{
	return x + y;
}
//减法:
int Sub(int x, int y)
{
	return x - y;
}
//乘法:
int Mul(int x, int y)
{
	return x * y;
}
//除法:
int Div(int x, int y)
{
	return x / y;
}

//菜单:
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; //计算的第一个数
	int y = 0; //计算的第二个数
	int ret = 0; //接收函数返回值
	
	//使用函数指针数组:
	int (*pfArr[5])(int, int) = {NULL, Add, Sub, Mul, Div};
	//“挤一位” 下标:				 0	   1	2    3    4

	do
	{
		menu();
		//从键盘输入:
		printf("请选择:>");
		scanf("%d", &input);

		if (input >= 1 && input <= 4)
			//输入有效,调用函数进行计算
		{
			//输入函数的两个参数:
			printf("请输入两个操作数:");
			scanf("%d %d", &x, &y);
			//通过 函数指针数组 来调用函数:
			ret = pfArr[input](x, y);
			// pfArr[数组下标](函数参数1,函数参数2)

			//打印计算结果:
			printf("计算结果为:%d\n", ret);
		}
		else if(input == 0) //退出
		{
			printf("退出计算器\n");
		}
		else //输入错误
		{
			printf("选择错误,重新选择\n");
		}

	} while (input);//如果input为0则退出停止循环

	return 0;
}

               

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                

7 . 指向函数指针数组的指针(了解)

(1). 含义:

本质上还是一个数组指针,只不过这里的数组函数指针数组

                 

例如:

int (*pf) (int, int);  --  函数指针

int (*pfArr [4]) (int, int);  --  函数指针数组

int (* (*p) [4]) (int, int) = &pfArr;  --  函数指针数组的指针

         

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

             

8 . 回调函数

(1). 含义:

            

回调函数就是一个通过函数指针调用的函数

           

如果你把函数的指针(地址)作为参数传递给另一个函数

当这个指针被用来调用其所指向的函数时,我们就说这是回调函数

               

回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时另外的一方调用,用于对该事件或条件进行响应

                

                

(2). 实例 -- 计算器(回调函数的使用):

编写计算器函数Calc()包含之前写的加减乘除四个函数

假如Calc() 函数通过函数指针调用了加法函数,这时加法函数就是 回调函数 了。

                    

使用回调函数的效果:

自定义函数部分:

学C的第二十六天【指针的进阶(二)】,CCC全是C,c语言,c++

            

主函数部分:

学C的第二十六天【指针的进阶(二)】,CCC全是C,c语言,c++

            文章来源地址https://www.toymoban.com/news/detail-549492.html

对应代码:

//计算器:
#include <stdio.h>

//加法:
int Add(int x, int y)
{
	return x + y;
}
//减法:
int Sub(int x, int y)
{
	return x - y;
}
//乘法:
int Mul(int x, int y)
{
	return x * y;
}
//除法:
int Div(int x, int y)
{
	return x / y;
}

//菜单:
void menu()
{
	printf("***************************\n");
	printf("*****  1.add   2.sub  *****\n");
	printf("*****  3.mul   4.div  *****\n");
	printf("*******   0.exit   ********\n");
	printf("***************************\n");
}

void Calc(int (*pf)(int x, int y)) //使用函数指针作为形参
{
	//在该函数中调用相应函数继续计算
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("请输入两个操作数:");
	scanf("%d %d", &x, &y);

	//通过形参的函数指针来调用函数 -- Calc()函数就是回调函数
	ret = pf(x, y);

	printf("ret = %d\n", ret);
}

int main()
{
	int input = 0; //菜单选择的数
	int x = 0; //计算的第一个数
	int y = 0; //计算的第二个数
	int ret = 0; //接收函数返回值

	do
	{
		menu();
		//从键盘输入:
		printf("请选择:>");
		scanf("%d", &input);

		//根据输入的数进行相应操作:
		switch (input)
		{
		case 1:
			Calc(Add); //函数名就是函数地址
			break;
		case 2:
			Calc(Sub); //函数名就是函数地址
			break;
		case 3:
			Calc(Mul); //函数名就是函数地址
			break;
		case 4:
			Calc(Div); //函数名就是函数地址
			break;
		case 0:
			printf("退出计算器\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}

	} while (input);//如果input为0则退出停止循环

	return 0;
}

到了这里,关于学C的第二十六天【指针的进阶(二)】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习Android的第十六天

    目录 Android 自定义 Adapter Adapter 接口 SpinnerAdapter ListAdapter BaseAdapter 自定义 BaseAdapter 参考文档 Android ListView 列表控件 ListView 的属性和方法 表头表尾分割线的设置 列表从底部开始显示 android:stackFromBottom 设置点击颜色 cacheColorHint 隐藏滑动条 在上一篇文章中我们知道了啥是 Adap

    2024年02月19日
    浏览(58)
  • 学习Bootstrap 5的第十六天

    目录 Flex(弹性)布局 弹性盒子(flexbox) 水平方向 垂直方向 对齐内容 等宽 伸展 顺序 自动外边距 包裹 对齐内容 子元素对齐 指定子元素对齐 响应式 Flex 类 Bootstrap 3 和 Bootstrap 4 5 的最大区别在于 Bootstrap 5 现在使用 flexbox 而不是浮动来处理布局。 弹性的框布局模块,可以更轻

    2024年02月06日
    浏览(40)
  • 秒懂百科,C++如此简单丨第十六天:指针

    目录 必看信息 Everyday English 前言  📝了解指针 📝定义指针 📝分析指针 📝运用指针 总结 ▶本篇文章由爱编程的小芒果原创,未经许可,严禁转载。 ▶本篇文章被收录于秒懂百科,C++如此简单专栏,欢迎订阅。 专栏亮点 1.每篇文章质量高,质量分保证在80分以上。 2.文章

    2024年02月01日
    浏览(57)
  • UCB Data100:数据科学的原理和技巧:第二十一章到第二十六章

    原文:SQL II 译者:飞龙 协议:CC BY-NC-SA 4.0 学习成果 介绍过滤组的能力 在 SQL 中执行数据清理和文本操作 跨表连接数据 在本讲座中,我们将继续上次的工作,介绍一些高级的 SQL 语法。 首先,让我们加载上一堂课的数据库。 HAVING 通过在每个组的所有行上应用一些条件来过

    2024年01月21日
    浏览(178)
  • VRRP技术和浮动路由(第二十六课)

    一、浮动路由 1、浮动路由概述 1)浮动路由是什么 -浮动路由又称为路由备份,由两条或多条链路组成浮动路由 -浮动路由指配置两条静态路由,这两条静态路由的目的地址相同,但是下一跳地址不同两条静态路由 -给这两条静态路由设置不同的优先级,优先级高的那条静态路

    2024年02月15日
    浏览(72)
  • 第二十六章 Unity碰撞体Collision(上)

    在游戏世界中,游戏物体之间的交互都是通过“碰撞接触”来进行交互的。例如,攻击怪物则是主角与怪物的碰撞,触发机关则是主角与机关的碰撞。在DirectX课程中,我们也大致介绍过有关碰撞检测的内容。游戏世界中的3D模型的形状是非常复杂的,我们不可能按照模型的原

    2024年02月04日
    浏览(79)
  • 《微服务实战》 第二十六章 Java锁的分类

    第二十八章 分布式锁框架-Redisson 第二十七章 CAS 第二十六章 Java锁的分类 第二十五章 Java多线程安全与锁 第二章 CountDownLatch和Semaphone的应用 第一章 Java线程池技术应用 本章节介绍Java中的几种常见的锁:公平锁和非公平锁、可重入锁、独享锁/共享锁、互斥锁/读写锁、乐观锁

    2024年02月06日
    浏览(104)
  • 服务(第二十六篇)redis的主从复制、哨兵、集群

    主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点。 原理: 主从关系确定好后,开启从节点时,会发送一个sync的同步命令给主节点,主节点接收到后会把redis内存

    2024年02月06日
    浏览(86)
  • C语言第二十六弹---字符串函数(下)

    ✨ 个人主页:   熬夜学编程的小林 💗 系列专栏:   【C语言详解】   【数据结构详解】 目录 1、strncat 函数的使用 2、strncmp 函数的使用 3、strstr 函数的使用和模拟实现 4、strtok 函数的使用 5、strerror 函数的使用 6、perror 函数的使用 总结 • Appends the first num characters of sourc

    2024年02月20日
    浏览(73)
  • vue 3 第二十六章:样式(scoped及样式穿透)

    在 Vue 中,我们可以使用 scoped 特性来给组件的样式添加作用域。通过为组件的 style 标签添加 scoped 特性,我们可以确保组件的样式仅应用于该组件的模板中,而不会影响其他组件或全局样式。 在上面的例子中, .example 类的样式只会应用于该组件的模板中,而不会影响其他组

    2024年02月06日
    浏览(86)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包