• c语言进阶:指针的进阶(下)


    回调函数

    我们还是以计算器为例来解释回调函数的使用

    int main()
    {
    	int x, y;
    	int input = 1;
    	int ret = 0;
    	do
    	{
    		printf("***********************\n");
    		printf("1:add               2:sub\n");
    		printf("3:mul               4:div\n");
    		printf("***********************\n");
    		printf("请选择 ");
    		scanf("%d", &input);
    		switch (input)
    		{
    		case 1:
    			printf("请输入两个操作数\n");
    			scanf("%d %d", &x, &y);
    			ret = add(x, y);
    			printf("%d\n", ret);
    			break;
    		case 2:
    			printf("请输入两个操作数\n");
    			scanf("%d %d", &x, &y);
    			ret = sub(x, y);
    			printf("%d\n", ret);
    			break;
    		case 3:
    			printf("请输入两个操作数\n");
    			scanf("%d %d", &x, &y);
    			ret = mul(x, y);
    			printf("%d\n", ret);
    			break;
    		case 4:
    			printf("请输入两个操作数\n");
    			scanf("%d %d", &x, &y);
    			ret = div(x, y);
    			printf("%d\n", ret);
    			break;
    		default:
    			printf("输入错误\n");
    			break;
    		}
    	} while (input);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    我们可以发现 case1 2 3 4里面有大量冗余的代码

    那么我们可不可以通过一定的手段解决这个问题呢?

    答案是可以 就是使用回调函数

    定义

    回调函数就是一个被作为参数传递的函数。

    我们来设计一个case_()函数 并且将add div这些函数作为参数传递进去

    要求: 可以实现和原函数一样的功能 代码不能冗余

    void calc(int(*p)(int x, int y))
    {
    	int x = 0;
    	int y = 0;
    	int ret = 0;
    	printf("请输入两个操作数\n");
    	scanf("%d %d", &x, &y);
    	ret = p(x, y);
    	printf("%d\n", ret);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这就是上面思想指导写出来的代码

    完整代码如下

    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 calc(int(*p)(int , int ))
    {
    	int x = 0;
    	int y = 0;
    	int ret = 0;
    	printf("请输入两个操作数\n");
    	scanf("%d %d", &x, &y);
    	ret = p(x, y);
    	printf("%d\n", ret);
    }
    
    int main()
    {
    	int x, y;
    	int input = 1;
    	int ret = 0;
    	do
    	{
    		printf("***********************\n");
    		printf("1:add               2:sub\n");
    		printf("3:mul               4:div\n");
    		printf("***********************\n");
    		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;
    		default:
    			printf("输入错误\n");
    			break;
    		}
    	} while (input);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    让我们试试它的运行结果

    在这里插入图片描述
    可以完美运行的

    本来是向给大家分上下两期讲完指针进阶的 但是好像上一期写的太多内容了 这一期只有一个回调函数可以写

    还有大量的指针题目我想放到配套作业专栏里去

    那这一期就先这样啦

    以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够

    不吝赐教 在评论区或者私信指正 博主一定及时修正

    那么大家下期再见咯

  • 相关阅读:
    哈希(开散列、闭散列)-位图-布隆过滤器-哈希切分
    当代博物馆中的3DGIS虚拟现实搭建
    【线性代数】三、特征值和特征向量
    有一个企微运营机器人同事是一种什么体验?
    Elasticsearch 安装-Windows
    APP测试(四)弱网测试
    【C++】堆栈的使用 | 堆栈的大小 | 动静态分配问题
    网络协议常用面试题汇总(二)
    在Node.js中,什么是模块(module)?如何导入和导出模块?
    C++ - git 命令行
  • 原文地址:https://blog.csdn.net/meihaoshy/article/details/126904795