Monday, December 27, 2021

[c] 使用typedef定義函式指標

簡單的函式指標的應用

char (*pFun)(int);   

char glFun(int a){ return;}   

void main()   

{   

    pFun = glFun;   

    (*pFun)(2);   

}

使用 typedef 更直觀更方便

typedefchar (*PTRFUN)(int);   

PTRFUN pFun;   

char glFun(int a){ return;}   

void main()   

{   

    pFun = glFun;   

    (*pFun)(2);   

}

#include <stdio.h>

#include <assert.h>

typedefint (*FP_CALC)(int,int);//定義一個函式指標型別

int add(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 b ? a/b : -1;  

}  

//定義一個函式,引數為op,返回一個指標,該指標型別為擁有兩個int引數、

//返回型別為int的函式指標。它的作用是根據操作符返回相應函式的地址

FP_CALC calc_func(char op)  

{  

    switch( op )  

    {  

    case'+':  

        return add;  

    case'-':  

        return sub;  

    case'*':  

        return mul;  

    case'/':  

        return div;  

    default:  

        return NULL;  

    }  

    return NULL;  

}  

//s_calc_func為函式,它的引數是 op,   

//返回值為一個擁有兩個int引數、返回型別為int的函式指標  

int (*s_calc_func(char op)) (int , int)  

{  

    return calc_func(op);  

}  

//終端使用者直接呼叫的函式,該函式接收兩個int整數,

//和一個算術運算子,返回兩數的運算結果

int calc(int a, int b, char op)  

{  

    FP_CALC fp = calc_func(op);  

    int (*s_fp)(int,int) = s_calc_func(op);//用於測試

    assert(fp == s_fp);// 可以斷言這兩個是相等的

    if(fp)  

        return fp(a,b);  

    else

        return -1;  

}  

void main()  

{  

    int a = 100, b = 20;  

    printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));  

    printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));     

    printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));     

    printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));   

No comments:

Post a Comment

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能