0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

函數(shù)指針和回調(diào)函數(shù)的使用方法

CHANBAEK ? 來(lái)源:嵌入式之入坑筆記 ? 作者:嵌入式之入坑筆記 ? 2023-04-10 15:08 ? 次閱讀

了解開發(fā)語(yǔ)言的朋友應(yīng)該都會(huì)對(duì)回調(diào)函數(shù)有所了解,在很多的程序開發(fā)語(yǔ)言中都能看到回調(diào)的身影。 很多場(chǎng)景下,當(dāng)某個(gè)條件成立以后我們希望代碼執(zhí)行某些指定的部分,這個(gè)時(shí)候可以考慮使用回調(diào)函數(shù)的方式,這樣做思路更加的清晰,也能使代碼結(jié)構(gòu)的邏輯更加清晰,結(jié)構(gòu)更加好。

那回調(diào)函數(shù)到底是什么呢? 它又是怎么實(shí)現(xiàn)的呢?

這是本次想要簡(jiǎn)單分析的一個(gè)主題。

但是在說(shuō)回調(diào)函數(shù)之前,我覺(jué)得很有必要先說(shuō)明一下 “函數(shù)指針” 這個(gè)概念,它是回調(diào)函數(shù)能夠?qū)崿F(xiàn)的重要基礎(chǔ)。

1、函數(shù)指針

學(xué)習(xí)過(guò)C語(yǔ)言的伙伴都知道,C語(yǔ)言中的靈魂 — 指針。 可以毫不猶豫地說(shuō),要檢驗(yàn)?zāi)銓?duì)C語(yǔ)言的掌握程度,那指針絕對(duì)是最好的考察方式。 指針的使用和變幻方式,真正的使用起來(lái)能讓你眼花繚亂。

下面是常見(jiàn)的指針的定義:

int *ptr1;
char *ptr2;
struct std *ptr3; // 結(jié)構(gòu)體指針

那函數(shù)指針到底是什么呢?

函數(shù)指針:函數(shù)指針是指向函數(shù)的指針變量。 簡(jiǎn)單理解是指向函數(shù)名的指針變量。

函數(shù)指針既然是指向函數(shù)的,那么它就可以像函數(shù)一樣,用于調(diào)用函數(shù)、傳遞參數(shù)等操作。 函數(shù)指針的定義方式如下:

函數(shù)返回值類型  (* 指針變量名) (函數(shù)參數(shù)列表);


“函數(shù)返回值類型”:表示該指針變量可以指向具有什么返回值類型的函數(shù);
“函數(shù)參數(shù)列表”:表示該指針變量可以指向具有什么參數(shù)列表的函數(shù)。


舉例如下:
int (*func1)(void)
int (*func2)(int,char,...)
char (*func3)(int,char,...)
......

從上面的演示可以看到,函數(shù)指針的定義就是將一個(gè)函數(shù)中的 “函數(shù)名” 改成“(* 指針變量名)”的方式,從而實(shí)現(xiàn)了一個(gè)函數(shù)指針的定義。

但是這里需要注意的是:“(* 指針變量名)”兩端的括號(hào)是必須要有的,如果缺少了這對(duì)括號(hào),那么這個(gè)定義的方式就會(huì)變?yōu)橹羔樅瘮?shù)。 如下:

int *func1(void)
int *func2(int,char,...)
char *func3(int,char,...)
......


這種就不是函數(shù)指針了,而是指針函數(shù)。兩者差別是很大的。

特別需要需要注意的一點(diǎn)是:指向函數(shù)的指針變量沒(méi)有 ++ 和 -- 運(yùn)算。

對(duì)于函數(shù)指針,一般為了方便使用,我們會(huì)選擇另外的一種定義方式:

typedef  函數(shù)返回值類型  (* 指針變量名) (函數(shù)參數(shù)列表);

比如:

typedef int (*Fun1)(int,...); 
typedef int (*Fun2)(int, int,...); 
typedef void (*Fun3)(void); 
typedef void* (*Fun4)(void*); 
......

2.、函數(shù)指針的使用方式

清楚了函數(shù)指針是什么東西了之后,那函數(shù)指針要怎么使用呢? 看下面的例子:

/* 1.首先定義一個(gè)函數(shù) */
int Func(int x);


/* 2.然后定義一個(gè)函數(shù)指針 */
int (*p) (int x); 


/* 3.將Func函數(shù)的首地址賦給指針變量p */
p = Func;
或
p = &Func; 


/* 4.然后使用p調(diào)用Func函數(shù) */
(*p) (int x);

因?yàn)楹瘮?shù)名 Func 代表函數(shù)的首地址,所以經(jīng)過(guò)賦值以后,指針變量 p 保存的就是Func的函數(shù)入口地址,即 p 就指向函數(shù) Func() 代碼的首地址。

為了加深函數(shù)指針的使用方式,看下面的一段代碼你就明白了。 如下:

#include 


int Max(int, int); //函數(shù)聲明


int main(void)
{
    int a, b, c;
    int(*p)(int, int); //定義一個(gè)函數(shù)指針


    p = Max; //把函數(shù)Max賦給指針變量p, 使p指向Max函數(shù)


    printf("please enter a and b:");
    scanf("%d %d", &a, &b);
    c = (*p)(a, b); //通過(guò)函數(shù)指針調(diào)用Max函數(shù)
    printf("a = %d\\nb = %d\\nmax = %d\\n", a, b, c);
    return 0;
}


int Max(int x, int y) //定義Max函數(shù)
{
    int z;
    if (x > y) z = x;
    else z = y;


    return z;
}

特別注意的是,因?yàn)楹瘮?shù)名本身就可以表示該函數(shù)地址(指針),因此在獲取函數(shù)指針時(shí),可以直接用函數(shù)名,也可以取函數(shù)的地址。

3. 函數(shù)指針可以作為函數(shù)的參數(shù)來(lái)使用

函數(shù)指針變量本身也是一個(gè)變量,也可以作為某個(gè)函數(shù)的參數(shù)進(jìn)行使用的。 如下:

#include 
#include 


// 定義一個(gè)函數(shù)指針類型的 FunType
typedef void(*FunType)(int);


void myFun(int x);
void hisFun(int x);
void herFun(int x);
void callFun(FunType fp,int x);


int main()
{
    callFun(myFun,1000);//傳入函數(shù)指針常量,作為回調(diào)函數(shù)
    callFun(hisFun,5000);
    callFun(herFun,4700);


    return 0;
}

4、回調(diào)函數(shù)

前面講了函數(shù)指針,現(xiàn)在終于到了回調(diào)函數(shù)了。 到這部分,我們就不說(shuō)太多的廢話,直接闡述回調(diào)函數(shù)是什么,回調(diào)函數(shù)要怎么使用,一步到位吧!

回調(diào)函數(shù):如果一個(gè)函數(shù)的指針(函數(shù)名或地址)作為參數(shù)傳遞給另外一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用其所指向的函數(shù)時(shí),就說(shuō)這個(gè)指針?biāo)赶虻暮瘮?shù)是一個(gè)回調(diào)函數(shù)。

再簡(jiǎn)明點(diǎn)說(shuō):回調(diào)函數(shù)不是直接調(diào)用該函數(shù)進(jìn)行使用的,而是要通過(guò)另外的特定事件或者其他函數(shù)進(jìn)行調(diào)用的,才能稱作回調(diào)函數(shù)。 定義一個(gè)函數(shù)然后直接調(diào)用,都不能稱為回調(diào)函數(shù)。

回調(diào)函數(shù)的定義方式和使用,直接通過(guò)下面的例子說(shuō)明,相信大家一看就會(huì)明白。

例程1:

/* 回調(diào)函數(shù) */
int Callback(void) 
{
    return 0;
}


int Library(int value,int (*MycallBackFunc)(void))
{
    if(value == 1)
MycallBackFunc();
    else
    return 1;
}




int main() 
{
    Library(1,Callback);    // 返回值為 0
return 0;
}

例程2:

int Callback_1(int a) // 回調(diào)函數(shù)1
{
    printf("Hello, this is Callback_1: a = %d ", a);
    return 0;
}


int Callback_2(int b) // 回調(diào)函數(shù)2
{
    printf("Hello, this is Callback_2: b = %d ", b);
    return 0;
}


int Callback_3(int c) // 回調(diào)函數(shù)3
{
    printf("Hello, this is Callback_3: c = %d ", c);
    return 0;
}


int MyHandle(int x, int (*MyCallback)(int)) 
{
    MyCallback(x);
}


int main()
{
    MyHandle(4, Callback_1);
    MyHandle(5, Callback_2);
    MyHandle(6, Callback_3);


    return 0;
}

從上面的代碼可以看出,MyHandle() 函數(shù)的參數(shù)有一個(gè)指針,在 main() 函數(shù)里調(diào)用MyHandle() 函數(shù)的時(shí)候,給它傳入了函數(shù) Callback_1()、Callback_2()、Callback_3() 的函數(shù)名,這時(shí)候的函數(shù)名就是對(duì)應(yīng)函數(shù)的指針,也就是說(shuō),回調(diào)函數(shù)其實(shí)就是函數(shù)指針的一種用法。

到此,通過(guò)上面的函數(shù)指針的說(shuō)明和回調(diào)函數(shù)的示例代碼,估計(jì)看到這里的朋友應(yīng)該都明白了回調(diào)函數(shù)的使用了吧!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136863
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    480

    瀏覽量

    70564
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68625
  • 回調(diào)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    87

    瀏覽量

    11563
  • 函數(shù)指針
    +關(guān)注

    關(guān)注

    2

    文章

    56

    瀏覽量

    3796
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一文詳解C語(yǔ)言函數(shù)指針調(diào)函數(shù)

    在講調(diào)函數(shù)之前,我們需要了解函數(shù)指針。
    發(fā)表于 10-19 09:34 ?795次閱讀

    C語(yǔ)言里面的函數(shù)指針調(diào)函數(shù)

    在講調(diào)函數(shù)之前,我們需要了解函數(shù)指針。
    發(fā)表于 12-13 10:28 ?637次閱讀

    一文詳解函數(shù)指針調(diào)函數(shù)

    函數(shù)指針是指向函數(shù)指針變量。它允許我們將函數(shù)作為參數(shù)傳遞給其他函數(shù)或?qū)?/div>
    發(fā)表于 08-22 10:36 ?528次閱讀

    函數(shù)指針、指針函數(shù)、調(diào)函數(shù)總結(jié)分享!

    看藍(lán)牙協(xié)議棧的時(shí)候遇到了調(diào)函數(shù),之前就沒(méi)有用過(guò),函數(shù)指針函數(shù)
    發(fā)表于 10-15 19:23

    C語(yǔ)言調(diào)函數(shù)學(xué)習(xí)

    對(duì)指針的應(yīng)用是C語(yǔ)言編程的精髓所在,而回調(diào)函數(shù)就是C語(yǔ)言里面對(duì)函數(shù)指針的高級(jí)應(yīng)用。簡(jiǎn)而言之,
    發(fā)表于 05-27 09:44 ?7206次閱讀

    LabWindows/CVI 程序 調(diào)函數(shù)設(shè)計(jì)

    調(diào)函數(shù)是系統(tǒng)框架設(shè)計(jì)中非常重要的一種手段,所謂調(diào)函數(shù)(callback )是指一個(gè)通過(guò)
    發(fā)表于 05-03 16:54 ?1.1w次閱讀
    LabWindows/CVI 程序 <b class='flag-5'>回</b><b class='flag-5'>調(diào)</b><b class='flag-5'>函數(shù)</b>設(shè)計(jì)

    LUA腳本API函數(shù)中的調(diào)函數(shù)使用方法和注意事項(xiàng)資料和程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是LUA腳本API函數(shù)中的調(diào)函數(shù)使用方法和注意事項(xiàng)資料和程序免費(fèi)下載。
    發(fā)表于 10-17 08:00 ?5次下載
    LUA腳本API<b class='flag-5'>函數(shù)</b>中的<b class='flag-5'>回</b><b class='flag-5'>調(diào)</b><b class='flag-5'>函數(shù)</b><b class='flag-5'>使用方法</b>和注意事項(xiàng)資料和程序免費(fèi)下載

    C語(yǔ)言函數(shù)調(diào)函數(shù)

    ,如果過(guò)后再執(zhí)行,則稱之為異步調(diào)。 調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)
    的頭像 發(fā)表于 09-11 09:57 ?4138次閱讀

    詳解調(diào)函數(shù)的概念及使用步驟

    調(diào)函數(shù)就是一個(gè)被作為參數(shù)傳遞的函數(shù)。在C語(yǔ)言中,調(diào)函數(shù)
    的頭像 發(fā)表于 05-26 15:20 ?4034次閱讀

    一文詳解C/C++調(diào)函數(shù)

    首先看一下調(diào)函數(shù)的官方解釋:調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)
    的頭像 發(fā)表于 02-12 09:20 ?1602次閱讀

    C語(yǔ)言技巧之調(diào)函數(shù)

    在講調(diào)函數(shù)之前,我們需要了解函數(shù)指針。
    的頭像 發(fā)表于 04-18 11:50 ?787次閱讀

    了解一下函數(shù)指針的概念和使用方法

    在講調(diào)函數(shù)之前,我們需要了解函數(shù)指針
    的頭像 發(fā)表于 11-06 10:04 ?687次閱讀
    了解一下<b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>的概念和<b class='flag-5'>使用方法</b>

    函數(shù)指針的五大作用

    1,調(diào)函數(shù)機(jī)制函數(shù)指針常用于實(shí)現(xiàn)調(diào)
    的頭像 發(fā)表于 12-06 08:00 ?1895次閱讀
    <b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>的五大作用

    函數(shù)指針調(diào)函數(shù)的應(yīng)用實(shí)例

    通常我們說(shuō)的指針變量是指向一個(gè)整型、字符型或數(shù)組等變量,而函數(shù)指針是指向函數(shù)。 函數(shù)指針
    的頭像 發(fā)表于 03-07 11:13 ?402次閱讀
    <b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>與<b class='flag-5'>回</b><b class='flag-5'>調(diào)</b><b class='flag-5'>函數(shù)</b>的應(yīng)用實(shí)例

    調(diào)函數(shù)(callback)是什么?調(diào)函數(shù)的實(shí)現(xiàn)方法

    調(diào)函數(shù)是一種特殊的函數(shù),它作為參數(shù)傳遞給另一個(gè)函數(shù),并在被調(diào)用函數(shù)執(zhí)行完畢后被調(diào)用。
    發(fā)表于 03-12 11:46 ?2948次閱讀