#include
int add(int x, int y)
{
return x + y;
}
int main()
{
int x, y;
scanf("%d %d", &x, &y);
int (*p)(int,int) = add;//函数声明
int ret = p(x, y);//函数调用
printf("%d", ret);
}
函数指针:指向函数的指针
函数声明:(*P)表明这是一个指针,前面的Int是函数的返回类型,(int,int )是参数类型。是否对函数add取地址&是都可以。
函数调用:对于指针p是否解引用*都可以,指针后面跟上参数类型(int,int).
下面举2个例子(来自c语言缺陷和陷阱)
void(*(signal(int ,void(*)(int)))(int)
首先signal和后面的括号结合,所以signal是函数名(int,void(*)(int))就是函数参数,分别是int,和函数指针void(*)(int).最后去掉函数名和函数参数就是void(*)(int)就是返回类型。
显然这是一个函数声明,可是我们写代码时,不能写的这么复杂。
优化如下:
typedef void(*pf)(int) pf要写在中间,重新命名为pf.
就可以写成这样pf(*signal)(int,void(*)(int))。
下面一个例子是函数调用的 (* (void(*)()) 0) ()
首先void(*)()是一个函数指针,后面的0被强制转化为函数指针,后面的()表明无参数。
只有函数指针是不好使用的,大部分要配上函数指针数组。
例如int(*p[4])(int,int)={add,sub,mul,div};
p先与[]结合意味着是数组,去掉p[4],int(*)(int,int)就是函数指针了;后面就是取地址操作。
#include
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, y = 0, ret = 0;
int (*p[])(int, int) = {0,Add,Sub,Mul,Div };
do
{
menu();
printf("请选择\n");
scanf("%d", &input);
if (input == 0)
{
printf("退出\n");
break;
}
else if (input > 0 && input <= 4)
{
printf("请输入两个数\n");
scanf("%d %d", &x, &y);
ret = p[input](x, y);
printf("%d\n", ret);
}
else
{
printf("选择错误\n");
break;
}
} while (input);
}
这是一个计算器的设计,就避免了switch语句重复写相同的语句,避免了程序的臃肿。