1.阅读下面两段代码
( * (void(*)())0)();//1
void(*signal(int, void(*)(int)))(int);//2
代码1:
void(*)()是函数指针类型
把0强转成函数指针类型,也就是说0地址处放置这一个没有参数且返回值为void的一个函数,然后调用这个函数。
代码2:
这是一个函数声明
2.函数指针数组的初始化与调用
#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(*pf1)(int, int) = Add;
int(*pf2)(int, int) = Sub;
int(*pf3)(int, int) = Mul;
int(*pf4)(int, int) = Div;
int(*pf[4])(int, int) = { Add, Sub, Mul, Div };
int i = 0;
for (i = 0; i < 4; i++)
{
printf("%d ", pf[i](8, 3));
}
system("pause");
return 0;
}
3.运用函数指针数组实现简单的计算器
#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 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;
int y = 0;
int(*pfarr[])(int, int) = { 0,Add,Sub,Mul,Div };
do
{
menu();
printf("请选择:");
scanf("%d", &input);
if (input == 0)
{
printf("退出计算器:\n");
}
else if (input <= 4 && input >= 1)
{
printf("请输入两个操作数:");
scanf("%d %d", &x, &y);
printf("%d\n",pfarr[input](x,y));
}
else
{
printf("输入错误,请重新输入\n");
}
} while (input);
return 0;
}
显然我们发现使用函数指针数组的局限性是只能返回同一个类型的数据