C语言函数指针
JDSZGLLL 人气:0前言
前面我们学习了各种各样的指针类型,有些指针可以说是稀奇百怪,特别是函数指针,有些朋友可能觉得,函数指针有些多余,调用函数为什么要用指针调用,直接调用不好吗?
接下来我们从具体的实例来回答同学们的问题,加深对函数指针的理解。
计算器的例子
接下来我们写一个简单的计算器程序,完成不同的计算功能比如加减乘除:
#include <stdio.h> //相加函数 int add(int a, int b) { return a + b; } //相减函数 int sub(int a, int b) { return a - b; } //相乘函数 int mul(int a, int b) { return a * b; } //相除函数 int div(int a, int b) { return a / b; } 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("输入操作数:"); scanf("%d %d", &x, &y); ret = add(x, y); printf("ret = %d\n", ret); break; case 2: printf("输入操作数:"); scanf("%d %d", &x, &y); ret = sub(x, y); printf("ret = %d\n", ret); break; case 3: printf("输入操作数:"); scanf("%d %d", &x, &y); ret = mul(x, y); printf("ret = %d\n", ret); break; case 4: printf("输入操作数:"); scanf("%d %d", &x, &y); ret = div(x, y); printf("ret = %d\n", ret); break; case 0: printf("退出程序\n"); break; default: printf("选择错误\n"); break; } } while (input); return 0; }
我们很明显地感觉到,是不是代码实在是有些繁琐,不同的功能之间有着高度的相似性,比如说进去之后都需要对x和y赋值,最后又都需要打印一个返回值,但在当前的框架下似乎又很难进行简化。
这时,我们就进入了今天的主题,如何使用函数指针来给程序瘦瘦身。
回调函数
我们先来看看使用回调函数修改之后的程序。
首先我们在原来的基础上构造了一个新的函数,函数的形参就是一个函数指针的形式:
//使用回调函数 void cumulate_numbers(int (*cumulate)(int, int)) { int x, y; int ret = 0; printf("输入操作数:"); scanf("%d %d", &x, &y); ret = cumulate(x, y); printf("ret = %d\n", ret); }
然后我们来看看调用函数方面有什么改变:
scanf("%d", &input); switch (input) { case 1: cumulate_numbers(add); break; case 2: cumulate_numbers(sub); break; case 3: cumulate_numbers(mul); break; case 4: cumulate_numbers(div); break; case 0: printf("退出程序\n"); break; default: printf("选择错误\n"); break; } } while (input);
我们可以清楚地认识到每次实现功能,通过函数指针使一开始的
printf("输入操作数:"); scanf("%d %d", &x, &y); ret = div(x, y); printf("ret = %d\n", ret);
转变为只要调用一个函数,一行代码就搞定了。我们这些功能比较简单,功能的数量也不多,使四行代码变成了一行,如果功能复杂一些,功能的数量再多一些,对于代码的简化量还是非常可观的。
那么接下来能否让我们更进一步呢?
转移表
我们再来看看更加简洁的代码:
int (*p[5])(int, int) = { 0, add, sub, mul, div }; do { printf("*************************\n"); printf(" 1:add 2:sub \n"); printf(" 3:mul 4:div \n"); printf("*************************\n"); printf("请选择:"); scanf("%d", &input); if ((input <= 4 && input >= 1)) { printf("输入操作数:"); scanf("%d %d", &x, &y); ret = (*p[input])(x, y); printf("ret = %d\n", ret); } else if(input != 0) printf("输入有误\n"); } while (input);
运用了指针数组,这个方法叫做转移表。
加载全部内容