首页 > 编程语言 > 详细

函数指针数组

时间:2021-04-10 00:08:17      阅读:19      评论:0      收藏:0      [点我收藏+]
我们先来看一下什么是函数指针
有一个函数

int Add(intx,inty){
return x+y;
}
int main(){

int x=10;
int y=20;
int ret=Add(x,y);
printf("%d",ret);
}

函数名Add
函数地址为Add,(也就是函数名)

函数指针,是用来存放函数地址的指针
那么我们看这个加法函数的地址就是Add
所以 我们怎么用函数指针,来存放这个Add函数地址呢?


int (*pa) (int,int)=Add

这是一个函数指针,函数地址为pa,(*pa)代表是一个指针,什么指针呢接着往下看,是个指向(int,int)函数参数类型为int的指针,返回类型为int.

这就是我们函数指针,那么函数指针数组是什么呢?
我们再来了解一下指针数组


int* arr[10]={0};

这是一个名叫arr数组,里面存放着10个元素,每个元素的元素类型为int* ,然后需要给这个数组初始化

回归正题,函数指针数组是什么呢?


int (*pa[ 元素个数]) (int,int)={初始化}

这就是一个函数指针数组,本质上是一个数组,用来存放函数指针数组名字为pa 参数有【】,*其他剩余的就是数组类型int ()(int,int),这是一个函数指针类型**。

我们来看函数指针数组的用途

我们来写一个代码,实现一个计算器。

void menu() {
    printf("******************************************\n");
    printf("******1.ADD            2.Jian*************\n");
    printf("*******3.Cheng         4.Chu**************\n");
    printf("*********    0.退出     ******************\n");
    printf("******************************************\n");
}

int Add(int x, int y) {
    return x + y;
}
int Jian(int x, int y) {
    return x - y;
}
int Cheng(int x, int y) {
    return x * y;
}
int Chu(int x, int y) {
    return x / y;
}
int main() {
    int input = 0;
    int x = 0;
    int y = 0;
    do {
        menu();
        printf("请选择菜单\n");
        scanf("%d", &input);

        switch (input) {
        case 1:
            printf("请输入两个数\n");
            scanf("%d%d", &x, &y);
            printf("%d\n", Add(x, y));
            break;
        case 2:
            printf("请输入两个数\n");
            scanf("%d%d", &x, &y);
            printf("%d\n", Jian(x, y));
            break;
        case 3:
            printf("请输入两个数\n");
            scanf("%d%d", &x, &y);
            printf("%d\n", Cheng(x, y));
            break;
        case 4:
            printf("请输入两个数\n");
            scanf("%d%d", &x, &y);
            printf("%d\n", Chu(x, y));
            break;
        case 0:
            printf("退出\n");
            break;
        default:
            printf("输入有误\n");
            break;
        }
    } while (input);
}

技术分享图片

这是我们利用普通的函数来实现的 这段代码,出现多处重复语句,总的来说就是太死板,太麻烦,如果我要添加一项其他的计算规则,又要去switch语句中,添加规则,到时候我的switch语句就老长老长了,代码出现任何问题,维护上来说也是难上加难!

我们来通过函数指针数组来简化这样的代码
void menu() {
    printf("******************************************\n");
    printf("******1.ADD            2.Jian*************\n");
    printf("*******3.Cheng         4.Chu**************\n");
    printf("*********    0.退出     ******************\n");
    printf("******************************************\n");
}

int Add(int x, int y) {
    return x + y;
}
int Jian(int x, int y) {
    return x - y;
}
int Cheng(int x, int y) {
    return x * y;
}
int Chu(int x, int y) {
    return x / y;
}
int main() {
    int input = 0;
    int x = 0;
    int y = 0;
    int(*pa[5])(int, int) = { 0,Add,Jian,Cheng,Chu };

    do {
        menu();
        printf("请选择菜单\n");
        scanf("%d", &input);

        if (input >= 1 && input <= 4) {
            printf("请输入两个数\n");
            scanf("%d%d", &x, &y);
            int ret = pa[input](x,y);
            printf("%d\n", ret);
        }
        else if (input == 0) {
            printf("退出");
        }
        else {
            printf("选择错误\n");
        }

    } while (input);
    }

通过数组下标找到元素,再通过元素找到函数
完美!!!
等等等等,再说明一点
函数指针数组的用途是:转移表!

函数指针数组

原文:https://blog.51cto.com/u_15100290/2694928

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!