How can I use an array of function pointers?

前端 未结 10 1135
别那么骄傲
别那么骄傲 2020-11-22 17:24

How should I use array of function pointers in C?

How can I initialize them?

相关标签:
10条回答
  • 2020-11-22 17:31

    You have a good example here (Array of Function pointers), with the syntax detailed.

    int sum(int a, int b);
    int subtract(int a, int b);
    int mul(int a, int b);
    int div(int a, int b);
    
    int (*p[4]) (int x, int y);
    
    int main(void)
    {
      int result;
      int i, j, op;
    
      p[0] = sum; /* address of sum() */
      p[1] = subtract; /* address of subtract() */
      p[2] = mul; /* address of mul() */
      p[3] = div; /* address of div() */
    [...]
    

    To call one of those function pointers:

    result = (*p[op]) (i, j); // op being the index of one of the four functions
    
    0 讨论(0)
  • 2020-11-22 17:32

    This "answer" is more of an addendum to VonC's answer; just noting that the syntax can be simplified via a typedef, and aggregate initialization can be used:

    typedef int FUNC(int, int);
    
    FUNC sum, subtract, mul, div;
    FUNC *p[4] = { sum, subtract, mul, div };
    
    int main(void)
    {
        int result;
        int i = 2, j = 3, op = 2;  // 2: mul
    
        result = p[op](i, j);   // = 6
    }
    
    // maybe even in another file
    int sum(int a, int b) { return a+b; }
    int subtract(int a, int b) { return a-b; }
    int mul(int a, int b) { return a*b; }
    int div(int a, int b) { return a/b; }
    
    0 讨论(0)
  • 2020-11-22 17:32

    This should be a short & simple copy & paste piece of code example of the above responses. Hopefully this helps.

    #include <iostream>
    using namespace std;
    
    #define DBG_PRINT(x) do { std::printf("Line:%-4d" "  %15s = %-10d\n", __LINE__, #x, x); } while(0);
    
    void F0(){ printf("Print F%d\n", 0); }
    void F1(){ printf("Print F%d\n", 1); }
    void F2(){ printf("Print F%d\n", 2); }
    void F3(){ printf("Print F%d\n", 3); }
    void F4(){ printf("Print F%d\n", 4); }
    void (*fArrVoid[N_FUNC])() = {F0, F1, F2, F3, F4};
    
    int Sum(int a, int b){ return(a+b); }
    int Sub(int a, int b){ return(a-b); }
    int Mul(int a, int b){ return(a*b); }
    int Div(int a, int b){ return(a/b); }
    int (*fArrArgs[4])(int a, int b) = {Sum, Sub, Mul, Div};
    
    int main(){
        for(int i = 0; i < 5; i++)  (*fArrVoid[i])();
        printf("\n");
    
        DBG_PRINT((*fArrArgs[0])(3,2))
        DBG_PRINT((*fArrArgs[1])(3,2))
        DBG_PRINT((*fArrArgs[2])(3,2))
        DBG_PRINT((*fArrArgs[3])(3,2))
    
        return(0);
    }
    
    0 讨论(0)
  • 2020-11-22 17:32

    The simplest solution is to give the address of the final vector you want , and modify it inside the function.

    void calculation(double result[] ){  //do the calculation on result
    
       result[0] = 10+5;
       result[1] = 10 +6;
       .....
    }
    
    int main(){
    
        double result[10] = {0}; //this is the vector of the results
    
        calculation(result);  //this will modify result
    }
    
    0 讨论(0)
  • 2020-11-22 17:33

    This simple example for multidimensional array with function pointers":

    void one( int a, int b){    printf(" \n[ ONE ]  a =  %d   b = %d",a,b);}
    void two( int a, int b){    printf(" \n[ TWO ]  a =  %d   b = %d",a,b);}
    void three( int a, int b){    printf("\n [ THREE ]  a =  %d   b = %d",a,b);}
    void four( int a, int b){    printf(" \n[ FOUR ]  a =  %d   b = %d",a,b);}
    void five( int a, int b){    printf(" \n [ FIVE ]  a =  %d   b = %d",a,b);}
    void(*p[2][2])(int,int)   ;
    int main()
    {
        int i,j;
        printf("multidimensional array with function pointers\n");
    
        p[0][0] = one;    p[0][1] = two;    p[1][0] = three;    p[1][1] = four;
        for (  i  = 1 ; i >=0; i--)
            for (  j  = 0 ; j <2; j++)
                (*p[i][j])( (i, i*j);
        return 0;
    }
    
    0 讨论(0)
  • 2020-11-22 17:34

    The above answers may help you but you may also want to know how to use array of function pointers.

    void fun1()
    {
    
    }
    
    void fun2()
    {
    
    }
    
    void fun3()
    {
    
    }
    
    void (*func_ptr[3])() = {fun1, fun2, fun3};
    
    main()
    {
        int option;
    
    
        printf("\nEnter function number you want");
        printf("\nYou should not enter other than 0 , 1, 2"); /* because we have only 3 functions */
        scanf("%d",&option);
    
        if((option>=0)&&(option<=2))
        { 
            (*func_ptr[option])();
        }
    
        return 0;
    }
    

    You can only assign the addresses of functions with the same return type and same argument types and no of arguments to a single function pointer array.

    You can also pass arguments like below if all the above functions are having the same number of arguments of same type.

      (*func_ptr[option])(argu1);
    

    Note: here in the array the numbering of the function pointers will be starting from 0 same as in general arrays. So in above example fun1 can be called if option=0, fun2 can be called if option=1 and fun3 can be called if option=2.

    0 讨论(0)
提交回复
热议问题