chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

CHANBAEK ? 來源:嵌入式之入坑筆記 ? 作者:嵌入式之入坑筆記 ? 2023-04-10 15:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

這是本次想要簡單分析的一個主題。

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

1、函數(shù)指針

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

下面是常見的指針的定義:

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

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

函數(shù)指針:函數(shù)指針是指向函數(shù)的指針變量。 簡單理解是指向函數(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ù)指針的定義就是將一個函數(shù)中的 “函數(shù)名” 改成“(* 指針變量名)”的方式,從而實現(xiàn)了一個函數(shù)指針的定義。

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

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


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

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

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

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.首先定義一個函數(shù) */
int Func(int x);


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


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


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

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

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

#include 


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


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


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


    printf("please enter a and b:");
    scanf("%d %d", &a, &b);
    c = (*p)(a, b); //通過函數(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;
}

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

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

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

#include 
#include 


// 定義一個函數(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ù)了。 到這部分,我們就不說太多的廢話,直接闡述回調(diào)函數(shù)是什么,回調(diào)函數(shù)要怎么使用,一步到位吧!

回調(diào)函數(shù):如果一個函數(shù)的指針(函數(shù)名或地址)作為參數(shù)傳遞給另外一個函數(shù),當這個指針被用來調(diào)用其所指向的函數(shù)時,就說這個指針所指向的函數(shù)是一個回調(diào)函數(shù)。

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

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

例程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ù)有一個指針,在 main() 函數(shù)里調(diào)用MyHandle() 函數(shù)的時候,給它傳入了函數(shù) Callback_1()、Callback_2()、Callback_3() 的函數(shù)名,這時候的函數(shù)名就是對應(yīng)函數(shù)的指針,也就是說,回調(diào)函數(shù)其實就是函數(shù)指針的一種用法。

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

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

    關(guān)注

    180

    文章

    7632

    瀏覽量

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

    關(guān)注

    1

    文章

    484

    瀏覽量

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

    關(guān)注

    30

    文章

    4898

    瀏覽量

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

    關(guān)注

    0

    文章

    88

    瀏覽量

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

    關(guān)注

    2

    文章

    57

    瀏覽量

    3969
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

    本文檔的主要內(nèi)容詳細介紹的是LUA腳本API函數(shù)中的調(diào)函數(shù)使用方法和注意事項資料和程序免費下載。
    發(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>和注意事項資料和程序免費下載

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

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

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

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

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

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

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

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

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

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

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

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

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

    通常我們說的指針變量是指向一個整型、字符型或數(shù)組等變量,而函數(shù)指針是指向函數(shù)。 函數(shù)指針
    的頭像 發(fā)表于 03-07 11:13 ?603次閱讀
    <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)用實例

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

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