在之前的学习中我们已经知道了,数组是一个存放相同类型数据的存储空间,而指针数组就是一个用来存放指针变量的数组,比如:
int* arr[10]; //数组的每个元素是int*
既然有了指针数组,那么我们能不能把函数的地址也都存到一个数组当中去?答案是肯定的,这样的一个数组就叫做函数指针数组,比如:
int (*parr[10])();
parr首先与[]结合表示一个数组名,这也就说明parr是数组,而数组的内容是
int (*)()类型的指针(也就是函数指针)
接下来看函数指针数组的运用,这里我们使用函数指针数组来实现一个计算器,在此之前,我们先来看不使用函数指针数组的计算器
#include <stdio.h>
#include <stdlib.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){
if (y != 0){
return x / y;
}
}
int main(){
int input;
int x, y;
int ret = 0;
while(1){
printf("*****************************\n");
printf(" 1. Add 2.Sub \n");
printf(" 3. Mul 4.Div \n");
printf("*****************************\n");
printf("请选择: ");
scanf("%d", &input);
switch(input){
case 1:
printf("请输入操作数: ");
scanf("%d %d", &x, &y);
ret = Add(x, y);
break;
case 2:
printf("请输入操作数: ");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
break;
case 3:
printf("请输入操作数: ");
scanf("%d %d", &x, &y);
ret = Mul(x, y);
break;
case 4:
printf("请输入操作数: ");
scanf("%d %d", &x, &y);
ret = Div(x, y);
break;
default :
printf("您的选择有误!\n");
break;
}
system("cls");
printf("ret = %d\n", ret);
}
system("pause");
return 0;
}
接下来使用函数指针数组去实现计算器的功能:
#include <stdio.h>
#include <stdlib.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){
if (y != 0){
return x / y;
}
}
int main(){
int input;
int x, y;
int ret = 0;
int (*p[5])(int x, int y) = { 0, Add, Sub, Mul, Div }; //转移表
while(1){
printf("*****************************\n");
printf(" 1. Add 2.Sub \n");
printf(" 3. Mul 4.Div \n");
printf("*****************************\n");
printf("请选择: ");
scanf("%d", &input);
if ((input > 0) && (input < 5)){
printf("请输入两个操作数: ");
scanf("%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else {
printf("您的输入有误!\n");
}
system("cls");
printf("ret = %d\n", ret);
}
system("pause");
return 0;
}
上面所提及的其实也是函数指针的一个用法,就是函数指针指向一个函数,而在此基础上扩展为函数指针数组(转移表).
除此之外,函数指针可以作为函数返回值出现,比如:
#include <stdio.h>
#include <stdlib.h>
int Add(int x, int y){
return x + y;
}
//函数fn的返回值为指针(指向函数 int xx(int a, int b)的指针)
int (*fn(int n))(int a, int b){
printf("fn: n = %d\n", n);
return Add;
}
int main(){
int value = fn(100)(3, 9);
printf("%d\n", value);
system("pause");
return 0;
}
函数指针作为函数参数出现
#include <stdio.h>
#include <stdlib.h>
int Add(int x, int y){
return x + y;
}
//函数指针作为函数参数出现
void test(int a, int b, int (*p)(int, int)){
printf("%d\n", p(a, b));
}
int main(){
test(3, 9, Add);
system("pause");
return 0;
}