回調函數與普通函數調用分不清楚?3分鍾幫你搞定!


在剛開始學習函數調用時,不少初學者弄不清楚“普通函數調用”和“回調函數”之間的區別,下面做一個簡單的對比分析。

一句話簡單區分:
普通函數調用: 函數直接被調用
回調函數:   函數作為參數被調用

這樣解釋或許還是不夠直觀,我們直接看例子吧!


 

普通函數調用

#include <stdio.h>

// 被調用的函數1
int func1(int value)
{
    printf("This is func1,value = %d\n",value);
    return 0;
}


// 被調用的函數2
int func2(int value)
{
    printf("This is func2,value = %d\n",value);
    return 0;
}


// 普通函數調用
int handle_call_back(int value1,int value2)
{
    func1(value1);  // 函數直接被調用
    func2(value2);  // 函數直接被調用
    return 0;
}

int main(void)
{
    int a = 66;
    int b = 88;
    handle_call_back(a,b);
    return 0;
}

執行結果

This is func1,value = 66
This is func2,value = 88


可以看出,這里普通函數的調用,是直接調用函數名func1和func2。


 

不帶參的回調函數

#include <stdio.h>

// 被調用的函數1
int call_back1(void)
{
    printf("This is call_back1\n");
    return 0;
}

// 被調用的函數2
int call_back2(void)
{
    printf("This is call_back2\n");
    return 0;
}

// 回調函數
int handle_call_back(int (*call_back)(void))
{
    call_back();
    return 0;
}

int main(void)
{
    handle_call_back(call_back1); // 函數作為參數被調用
    handle_call_back(call_back2); // 函數作為參數被調用
    return 0;
}

執行結果

This is call_back1
This is call_back2
 
可以看出,call_back系列函數是作為handle_call_back的參數被調用的。上面是不帶參數的回調函數,那帶參的回調函數呢?

帶參數的回調函數

#include <stdio.h>

// 被調用的函數1
int call_back1(int value1)
{
    printf("This is call_back1,value = %d\n",value1);
    return 0;
}

// 被調用的函數2
int call_back2(int value2)
{
    printf("This is call_back2,value = %d\n",value2);
    return 0;
}

// 回調函數
int handle_call_back(int value,int (*call_back)(int))
{
    call_back(value);
    return 0;
}

int main(void)
{
    int a = 10;
    int b = 20;
    handle_call_back(a,call_back1); // 函數作為參數被調用
    handle_call_back(b,call_back2); // 函數作為參數被調用
    return 0;
}

執行結果

This is call_back1,value = 10
This is call_back2,value = 20

上面的例子可以看出,handle_call_back中的參數value,可以傳給int (*call_back)(int),實現了帶參回調函數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM