天天看點

18. 函數指針,函數指針數組與指向函數指針數組的指針1. 函數指針2. 函數指針的數組3. 指向函數指針數組的指針

  C語言是一門面向過程的語言,而面向過程最大的利器就是函數,今天我們就來研究一下函數指針相關的話題。

1. 函數指針

  首先看一個例子。

#include <stdio.h>
    #include <stdlib.h>

    int add(int x, int y) {
        return x + y;
    }

    int main() {
        int a = ;
        int b = ;
        // 
        printf("%p\n", add);
        printf("%p\n", &add);

        system("pause");
        return ;
    }
           

  運作結果:

18. 函數指針,函數指針數組與指向函數指針數組的指針1. 函數指針2. 函數指針的數組3. 指向函數指針數組的指針

  由結果我們可以得出一個結論:

函數名也是函數的指針。

  但是呢,這不是我們今天要要讨論的函數指針,就像之前我們研究過的數組指針,那數組名也是指向數組的指針,但它卻不是我們要研究的數組指針。而函數名在這裡就相當于數組名。

  接下來,我們看一看我們今天要研究的函數指針。

定義一個函數指針
    int add(int a, int b)
    {
        int ret = a + b;
        printf("%d\n", ret);
        return ret;
    }
    int main()
    {
        // 一個名為 p ,參數為兩個 int 的函數指針
        int (*p)(int, int);
        p = add;
        p(, );
        return ;
    }
           

  其實也挺簡單的,下一個例子。

(*(void(*)()))();
           

  它代表了什麼?

  逐一進行分析。

18. 函數指針,函數指針數組與指向函數指針數組的指針1. 函數指針2. 函數指針的數組3. 指向函數指針數組的指針

  再看一個例子。

void (*signal(int,void(*)(int)))(int)
    // 它代表了什麼?

    // 答案:
    // 傳回類型為 void (*)(int)   void類型的參數為int的函數指針
    // 函數名為   signal(int ,void(*)(int))

    //改造一下
    typedef void(*func_p)(int); //func_p是一個類型重命名

    func_p signal(int ,func_p);
           

  接下來,我們進階一下,研究一下函數指針的數組和指向函數指針數組的指針,對于函數指針和數組指針不太明白的可以參考一下這篇文章。

C語言指針數組與數組指針

2. 函數指針的數組

  函數指針的數組,顧名思義,數組裡存放的元素都是指針,這些指針的類型為函數指針類型。

  看下面的示例:

void test(int a,char c);
    void test2(int a,char c);
    void test3(int a,char c);

    // 定義一個函數指針數組,類型為 void(* )(int,char)
    void (*p[])(int,char) = {test,test2,test3};


    //調用函數指針的數組
    p[](,'2');
           

  擁有了函數指針數組,我們可以将它應用到很多的場景下,如下面的例子

  使用函數指針數組編寫一個電腦:

//電腦
    int add(int a,int b);
    int sub(int a,int b);
    int mul(int a,int b);
    int div(int a,int b);
    void menu_end(void);
    void menu_start(void);
    int main()
    {
        int x = ;
        int y = ;
        int input = ;
        int flag = ;
        //轉移表
        int (*pfunarr[])(int ,int) = {NULL,add,sub,mul,div};
        do
        {
            menu_start();
            scanf("%d",&input);         //算法
            scanf("%d%d",&x,&y);        //數值
            printf("result = %d\n",pfunarr[input](x,y));
            menu_end();
            scanf("%d",&flag);          //是否繼續
        }while(flag);
        return ;
    }
           

3. 指向函數指針數組的指針

  這個很簡單,即一個指向 函數指針數組 的指針,我們要注意的是它的指針類型。

void (*(*ptr)[])(int ,char ) = &p
//ptr是一個數組,指向一個數組
// 該數組是一個函數指針數組,每個元素是一個函數指針,
// 指針指向一個傳回類型為void,參數為 int,char 的函數
           

繼續閱讀