这篇只是对函数指针的应用进行一个补充,所以内容可能比较短小。
今天所有知识都是从这个基础计算器开始的
#define _CRT_SECURE_NO_WARNINGS 1
#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;
}
int main()
{
int x = 0;
int y = 0;
int i = 0;
do
{
printf("**0:退出***********\n");
printf("**1:加法 2:减法***\n");
printf("**3:乘法 4:除法***\n");
printf("*>:请输入 *******\n");
printf("********************\n");
scanf("%d", &i);
printf("输入两数");
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
switch (i)
{
case 1:
{
printf("%d", Add(x, y));
return 0;;
}
case 2:
{
printf("%d", Sub(x, y));
return 0;
}
case 3:
{
printf("%d", Mul(x, y));
return 0;
}case 4:
{
printf("%d", Div(x, y));
return 0;
}case 0:
{
return 0;
}
dafault:
{
break;
}
}
} while (1);
return 0;
}
回调函数
case 1:
{
printf("%d", Add(x, y));
return 0;;
}
case 2:
{
printf("%d", Sub(x, y));
return 0;
}
case 3:
{
printf("%d", Mul(x, y));
return 0;
}case 4:
{
printf("%d", Div(x, y));
return 0;
这个部分同样也可以通过回调函数进行实现
那什么是回调函数?
说的通俗一点就是通过函数指针来调用函数
比如说:
int Add(int x,int y)
{
return x+y;
}
int main()
{
int(*pf)(int,int)=&Add;
pf(3,3);
}
这个代码中,pf就是对Add这个函数进行了回调。
大家这个时候看了代码,想必会产生和我刚学时一样疑问:这这个不是脱裤子放屁吗,明明直接使用Add即可实现调用。
大家先别急,我们可以用这个小知识来实现这个计算器的小优化
#define _CRT_SECURE_NO_WARNINGS 1
#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 calc(int(*pf)(int,int))
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("%d", pf(a, b));
}
int main()
{
int x = 0;
int y = 0;
int i = 0;
do
{
printf("**0:退出***********\n");
printf("**1:加法 2:减法***\n");
printf("**3:乘法 4:除法***\n");
printf("*>:请输入 *******\n");
printf("********************\n");
scanf("%d", &i);
switch (i)
{
case 1:
{
calc(Add);
return 0;;
}
case 2:
{
calc(Sub);
return 0;
}case 3:
{
calc(Mul);
return 0;
}case 4:
{
calc(Div);
return 0;
}case 0:
{
return 0;
}
dafault:
{
break;
}
}
} while (1);
return 0;
}
在这个代码中大家可以清楚的看到,CALC这个函数通过函数指针,进行对相应的功能函数进行调用。
转移表
这个使用了回调函数。
同时配上了函数指针数组,这两个将会产生剧烈的化学反应。
众所周知:指针函数数组是存放函数指针的数组
既然我们可以通过函数指针进行调用函数,那我们可不可以将所有相同返回类型,相同参数的指针放入同一个数组
这样通过数组进行对功能函数的调用?
答案肯定是可以的,同样这就是转移表的使用。
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;
}
int (*clac[5])(int x, int y) = {NULL,Add,Sub,Mul,Div };
int main()
{
int x = 0;
int y = 0;
int i = 0;
do
{
printf("**0:退出***********\n");
printf("**1:加法 2:减法***\n");
printf("**3:乘法 3:除法***\n");
printf("*>:请输入 *******\n");
printf("********************\n");
scanf("%d", &i);
if (i == 0)
{
printf("已退出");
break;
}
else if (i >= 0 && i <= 5)
{
printf(">:请输入两个数");
scanf("%d %d", &x, &y);
printf("%d", clac[i](x,y));
break;
}
else
printf("输入错误,请重新输入");
} while (1);
}