一、函数指针
数据在内存中都有自己的地址,地址需要指针变量来保存,我们常见的指针有char* 、int* 、double*、float*。
函数也有自己的地址,保存函数的地址的变量就是函数指针。但函数指针的形式较为复杂,下面举几个例子来说明函数指针的形式。
void (* pfun1)();
pfun1 先和 * 结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。
int(* pfun2)(int, int);
pfun2先和 * 结合,说明pfun2是指针,指针指向的是一个函数,指向的函数参数为int、int,返回值为int。
double(* pfun3)(int, char);
pfun3先和 * 结合,说明pfun3是指针,指针指向的是一个函数,指向的函数参数为int、char,返回值为double。
二、函数指针数组
数组是用来存放多个相同类型变量的
如
int a[10];//数组有10个元素,每个元素类型为int
char ch[5];//数组有5个元素,每个元素类型为char
double d[20];//数组有20个元素,每个元素类型为double
同理,函数指针数组就是存放多个函数指针的数组,但它的形式较为复杂。
int (*parr1[10])(int, int);
//含有10个元素的数组,每个元素为函数指针
//且函数指针指向的函数参数为int、int,返回值为int。
double (*parr2[5])(int, char);
//含有5个元素的数组,每个元素为函数指针
//且函数指针指向的函数参数为int、char,返回值为double。
三、应用:两个数的加减乘除运算
将加减乘除分别封装成四个函数,在main函数中调用。
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, y, input, ret;
int(*pfArr[])(int, int) = { 0, ADD,SUB, MUL, DIV };
//0只是为了下面调用函数是方便,不放也可以
//函数指针数组,内部的四个函数指针指向的函数类型相同,
//参数为int、int,返回值为int。
do
{
printf("0.退出\n1.加\n2.减\n3.乘\n4.除\n");
scanf("%d", &input);
if (0 == input)
{
printf("退出\n");
}
else if (input >= 1 && input <= 4)
{
printf("请输入两个数");
scanf("%d%d", &x, &y);
printf("%d\n", (pfArr[input](x, y)));
//如(pfArr[1](1, 2))就是调用数组下标为1的元素,
//在这里是调用ADD函数,并用1和2进行运算
//即对1和2进行加法运算
}
else
{
printf("输入错误,重新输入\n");
}
} while (input);
}