C之函數(shù)與指針(三十二)-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、網(wǎng)站制作、蒼梧網(wǎng)絡(luò)推廣、成都微信小程序、蒼梧網(wǎng)絡(luò)營銷、蒼梧企業(yè)策劃、蒼梧品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供蒼梧建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:muchs.cn

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

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

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

#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行用它這種類型的指針來指向函數(shù) test 是不會出錯的,第18行定義的指針 pf 也是如此。接下來我們打印三個地址值,理論上三個值應(yīng)該一樣,因為他們都是在打印函數(shù) f 的入口地址。接著第24行的 pf() 相當于調(diào)用了 f(),第26行也相當于調(diào)用了 f()。最后打印了 pt(2) 相當于 test(2) ,會打印出 4。我們來看看編譯結(jié)果

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

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

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

#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;
}

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

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

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

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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站欄目:C之函數(shù)與指針(三十二)-創(chuàng)新互聯(lián)
URL地址:http://muchs.cn/article24/deipce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站外貿(mào)建站、做網(wǎng)站、定制開發(fā)網(wǎng)站建設(shè)、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)