欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

使用函数 (*foo[])

最编程 2024-06-21 09:03:13
...

函数指针数组的使用场景

函数指针数组即函数指针的数组。

在使用C语言构造解释器的过程中,对于词法分析得到的Token在进行语法分析的过程中,对于不同的类别的Token此处函数需要进行一个识别。输入参数假定为int* buffervoid* value,其中int* buffer用来识别Token的类型,如浮点数、整数等;void* valueToken的具体值。假设此处没有封装成一个类,仅仅是一个主函数需要对不同接受类型的Token进行不同的函数调用,假设有100种不同的类型。

若按通常做法,会写出如下代码:

void MyFuntion( int* buffer, void*value ){
    switch(buffer[0]){
        case 1 :
            function1();
            break;
        case 2 :
            function2();
            break;
        case 3 :
            ...... 
        case 100:
            function100();
            break;
    }
}  

按照这种写法,每一次对于不同的Token都要进行多次判断之后才能找到正确的函数处理函数,代码的执行效率较低,这里就可以适用函数指针数组的概念解决多次判断的问题。

按函数指针数组的思路,会写出如下代码:

void funtion0(void); 
......
void funtion100(void); 
void (*fun[100])(void) = {funtion0,......,funtion100};

void MyFuntion( int* buffer, void*length ){
    (*fun[buffer[0]])();
}  

只要2行代码,就完成了100条case语句要做的事,减少了编写代码时工作量,从代码执行效率上来说,直接调用函数指针,也比case语句高。

给一个可运行的实际案例:


#include <stdio.h>


#include <stdbool.h>


#define swap(x,y) {typeof(x) t = x; x = y; y = t;}


bool rule1(int x, int y){
    return x > y;
}

bool rule2(int x, int y){
    return x < y;
}

bool rule3(int x, int y){
    return x%3 < y%3;
}

void sort(int *a,int n, bool (*f)(int,int)){
    for (int i = 0; i < n - 1;i ++){
        for (int j = 0; j < n - 1;j ++){
            if (f(a[j],a[j+1]))
                swap(a[j],a[j+1]);
        }
    }
}

void print(int *a,int n){
    for (int i = 0; i < n; i ++){
        printf("%d",a[i]);
    }
    printf("\n");
}

int main(){
    int a[10] = {2,1,3,8,0,4,6,5,7,9};
    //定义函数指针数组
    bool (*f[])(int,int) = {rule1,rule2,rule3};
    sort(a,10,f[0]);
    print(a,10);
    return 0;
}