中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C之函數與指針(三十二)

發布時間:2020-07-01 13:46:40 來源:網絡 閱讀:523 作者:上帝之子521 欄目:編程語言

        在 C 語言中的每個函數都有自己特定的類型,函數的類型由返回值,參數類型和參數個數共同決定。如 int add(int i, int j) 的類型為 int(int, int);在 C 語言中通過 typedef 為函數類型重命名,如 typedef type name(parameter list);例:typedef int f(int, int);typedef void p(int);

        我們來講下函數指針,那么什么是函數指針呢?函數指針用于指向一個函數,函數名是執行函數體的入口地址。可通過函數類型定義函數指針:FuncType* pointer;也可以直接定義:type(*pointer)(parameter list);其中 pointer 為函數指針變量名,type 為所指函數的返回值類型,parameter list 為所指函數的參數類型列表。

        那么我們在嵌入式的筆試面試中經常遇到:如何使用 C 語言直接跳轉到某個固定的地址處開始執行?這個問題咋一看感覺無解啊,但其實我們仔細想想,還是有辦法的。就是通過函數指針來實現的,我們在前面講過函數名是執行函數的入口地址,那么我們是否可以通過函數指針來指向這個地址呢?當然可以啦,這就實現了直接跳轉到一個固定的地址處開始執行。

        下來我們以代碼為例進行分析,代碼如下

#include <stdio.h>

typedef int(FUNC)(int);

int test(int i)
{
    return i * i;
}

void f()
{
    printf("Call f()...\n");
}

int main()
{
    FUNC* pt = test;
    void(*pf)() = &f;
    
    printf("pf = %p\n", pf);
    printf("f = %p\n", f);
    printf("&f = %p\n", &f);
    
    pf();
    
    (*pf)();
    
    printf("Function pointer call: %d\n", pt(2));
    
    return 0;
}

        我們來分析下這個代碼,我們在第3行定義了 FUNC 為 int(int) 型的。所以我們在第17行用它這種類型的指針來指向函數 test 是不會出錯的,第18行定義的指針 pf 也是如此。接下來我們打印三個地址值,理論上三個值應該一樣,因為他們都是在打印函數 f 的入口地址。接著第24行的 pf() 相當于調用了 f(),第26行也相當于調用了 f()。最后打印了 pt(2) 相當于 test(2) ,會打印出 4。我們來看看編譯結果

C之函數與指針(三十二)

        接下來我們來講下回調函數。那么什么是回調函數呢?它是利用函數指針實現的一種調用機制。回調函數原理是:a> 調用者不知道具體事件發生時才需要調用具體函數;b> 被調函數不知道何時被調用,只知道需要完成的任務;c> 當具體事件發生時,調用者通過函數指針調用具體函數。回調機制中的調用者和被調函數互不依賴。

        下來我們以代碼為例進行分析,代碼如下

#include <stdio.h>

typedef int(*Weapon)(int);

void fight(Weapon wp, int arg)
{
    int result = 0;
    
    printf("Fight boss!\n");
    
    result = wp(arg);
    
    prinf("Boss loss: %d\n", result);
}

int knife(int n)
{
    int ret = 0;
    int i = 0;
    
    for(i=0; i<n; i++)
    {
        printf("Knife attack: %d\n", 1);
        ret++;
    }
    
    return ret;
}

int sword(int n)
{
    int ret = 0;
    int i = 0;
    
    for(i=0; i<n; i++)
    {
        printf("Sword attack: %d\n", 5);
        ret += 5;
    }
    
    return ret;
}

int gun(int n)
{
    int ret = 0;
    int i = 0;
    
    for(i=0; i<n; i++)
    {
        printf("Gun attack: %d\n", 10);
        ret += 10;
    }
    
    return ret;
}

int main()
{
    fight(knife, 3);
    fight(sword, 4);
    fight(gun, 5);
    
    return 0;
}

        我們這份代碼是利用了游戲中打老怪的思想,我們打老怪時不知道用的是什么武器。所以只能通過函數指針來調用具體的函數,也就是所謂的武器。然后我們定義了小刀、劍和槍三種武器,在主函數中打老怪的時候分別調用了三種武器。我們來看看編譯結果

C之函數與指針(三十二)

        我們發現用小刀的***力最低,用槍的***力最高。通過這個示例代碼,我們很好地詮釋了回調函數的原理。通過本節對函數指針的學習,總結如下:1、C 語言中的函數都有特定的類型;2、可以使用函數類型定義函數指針;3、函數指針是實現回調機制的關鍵技術,通過函數指針可以在 C 程序中實現固定地址跳轉。


         歡迎大家一起來學習 C 語言,可以加我QQ:243343083

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南华县| 台安县| 凤凰县| 林甸县| 临夏市| 灵台县| 吉林市| 南溪县| 阿克苏市| 沽源县| 三门县| 广宗县| 宁晋县| 广州市| 海宁市| 伊春市| 保定市| 高安市| 呈贡县| 商水县| 子洲县| 汪清县| 河南省| 双柏县| 留坝县| 涞源县| 乾安县| 桐乡市| 监利县| 洛宁县| 新蔡县| 象山县| 壶关县| 微博| 富阳市| 武义县| 泗洪县| 阜城县| 凤庆县| 犍为县| 阿拉善盟|