【理论分析篇】
首先我们先来看这样的几句代码:
int *fun(int,int);
int (*pfun)(int,int);
int (*ppfun[5])(int,int);
int (*(*pppfun)[5])(int,int);
看到这几句代码,是不是感觉要晕啦!不过不要怕!我们开始一句一句的分析:
.int *fun(int,int)
是一个有两个整形参数的函数,而且它的返回值是int *类型的.
1.函数指针
.int (*pfun)(int,int)
.是一个函数指针,顾名思义,首先它是一个指针,指向的是一个函数,从本质上说它就是函数的指针;函数指针就是一个指针它的返回值类型为int,而且它具有两个整形的参数.
2.函数指针数组
.int(*ppfun[5])(int,int)
.是函数指针数组,我们可以发现这句代码相对于第二句代码多了一个代表数组标志的方括号,这是函数指针数组与函数指针的区别之一,函数指针数组就是数组中的每一个元素都是指向函数的指针.
3.指向函数指针数组的指针
.int(*(*pppfun)[5])(int,int)
.是指向函数指针数组的指针,在本质上依然是个指针,这个指针指向的是一个数组,数组里面存放的是函数指针,不过它是指向函数指针数组的指针.
【理论实践篇】
函数指针的使用范例
实现一个运算器,包括加法,减法,乘法和除法,使用函数指针
我们知道函数指针就是指向函数的指针,我们可以通过传不同参数的地址实现不同的功能,代码实现如下:
void menu()
{
printf("**0.退出**\n");
printf("**1.加法**\n");
printf("**2.减法**\n");
printf("**3.乘法**\n");
printf("**4.除法**\n");
}
int Add(int num1, int num2) //加法
{
return num1+num2;
}
int Sub(int num1, int num2) //减法
{
return num1-num2;
}
int Mul(int num1, int num2) //乘法
{
return num1*num2;
}
int Div(int num1, int num2) //除法
{
if(num2 != 0) //判断除数是否是零
return num1/num2;
return 0;
}
int Operate(int (*pfun)(int , int)) //函数指针
{
int num1 = 0;
int num2 = 0;
printf("请输入两个操作数>:");
scanf("%d%d",&num1, &num2);
return pfun(num1, num2);
}
int (*arr[5])(int , int) = {0, Add, Sub, Mul, Div}; //转移表
int main()
{
int ret=0;
int input = 1;
while(input)
{
menu();
printf("请选择你要进行的操作>:");
scanf("%d",&input);
if(input>= 1 && input<= 4)
{
ret = Operate(arr[input]);
printf("操作后的结果为:%d\n", ret);
}
else if(input == 0)
{
system("pause");
return 0;
}
else
{
printf("选择错误\n");
}
}
system("pause");
return 0;
}