函數(shù)指針和回調(diào)函數(shù)的示例分析-創(chuàng)新互聯(lián)

小編給大家分享一下函數(shù)指針和回調(diào)函數(shù)的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站制作、成都網(wǎng)站設(shè)計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元建安做網(wǎng)站,已為上家服務(wù),為建安各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108

一. 函數(shù)指針

  關(guān)于函數(shù)指針的概念,可以想到一個整型指針指向的是一個整型,它的值是所指向?qū)ο蟮牡刂?;一個字符串指針指向的是一個字符串,它的值是所指向字符串的首地址;因此,一個函數(shù)指針當(dāng)然是一個指針變量了,它所指向的是一個函數(shù),它的值就是所指向函數(shù)的入口地址

函數(shù)指針的定義如下:

typedef int data_type;

data_type (*pfun)(data_type, data_type);

上面的語句中定義了一個函數(shù)指針pfun,它表示指向一個返回值為data_type,參數(shù)為兩個data_type類型的函數(shù),上面第一個括號也就是(*pfun)的括號不能省略,否則就會變成:


data_type *pfun(data_type, data_type);

這樣的話就為聲明一個函數(shù)名為pfun的函數(shù)了,它的返回值為data_type*,參數(shù)為兩個data_type類型的參數(shù);

下面舉個栗子說明函數(shù)指針的使用:

#include <iostream>
using namespace std;

typedef int data_type;

data_type add(data_type& a, data_type& b)
{
	return (a + b);
}

int main()
{
	data_type a = 2;
	data_type b = 3;
	data_type (*pfun)(data_type&, data_type&);
	pfun = &add;

	cout<<pfun(a, b)<<endl;
	return 0;
}

上面的程序中實現(xiàn)了一個函數(shù)add,并且定義了一個函數(shù)指針pfun指向這個函數(shù),對函數(shù)指針的賦值和使用其他指針賦值語句一樣,可以取函數(shù)的地址直接賦過去,但是因為函數(shù)名作為函數(shù)的入口地址,因此也可以不加取地址操作符“&”而直接將函數(shù)名賦給函數(shù)指針;要注意的是,函數(shù)指針的定義中,參數(shù)類型、個數(shù)和返回值必須和要指向的函數(shù)原型中的參數(shù)類型、個數(shù)和返回值一一對應(yīng);

運行程序會得到結(jié)果5;

  指針在C/C++中是一個很靈活的變量,它可以指向與自己類型相同的不同存儲空間,比如在數(shù)組中通常可以用指針來操縱,但這里值得注意的是,在一個數(shù)組或者字符串中使用指針進行加減操作會進行相應(yīng)的移位指向下一個空間,有整型指針數(shù)組也就自然會有函數(shù)指針數(shù)組,它的數(shù)組成員都是一個個指向某個函數(shù)的函數(shù)指針,而在這樣的數(shù)組中用指針進行加減操作就指向的是不同的函數(shù)指針也就是不同的函數(shù)了,單純的對一個函數(shù)指針進行加減操作是不能夠的,它并不會指向在當(dāng)前函數(shù)上面或下面定義的某個函數(shù)。

  像給一個整型指針賦值一樣,可以給一個函數(shù)指針賦予不同的函數(shù),這樣就可以靈活的用一個指針來調(diào)用不同的函數(shù)而不用將每個函數(shù)都顯式的寫出來。

二. 回調(diào)函數(shù)

  上面談?wù)摰暮瘮?shù)指針其實就是在為談回調(diào)函數(shù)做鋪墊,什么是回調(diào)函數(shù)?其實回調(diào)函數(shù)就是函數(shù)指針的一種使用,用戶自己定義一個函數(shù),將這個指向這個函數(shù)的函數(shù)指針作為參數(shù)傳遞給一個系統(tǒng)函數(shù)或者中間函數(shù),當(dāng)這個系統(tǒng)函數(shù)或中間函數(shù)執(zhí)行的時候調(diào)用這個函數(shù)指針去執(zhí)行用戶定義的函數(shù),那么用戶定義的這個函數(shù)就叫做回調(diào)函數(shù)。

  為什么會有回調(diào)函數(shù)呢?難道就不能在一個函數(shù)里面直接調(diào)用用戶所寫的函數(shù)而不是傳參過去嗎?這種直接使用被調(diào)用函數(shù)的用法是在我們知道調(diào)用函數(shù)的內(nèi)部實現(xiàn)機制的情況下直接寫入的,那么,如果調(diào)用函數(shù)是系統(tǒng)內(nèi)部函數(shù)或者是別人所給的一個函數(shù)借口呢?再如果有一種設(shè)計需求,要求執(zhí)行一個函數(shù)但并不知道調(diào)用該函數(shù)的函數(shù)是如何操縱的呢?這樣就沒辦法直接在調(diào)用函數(shù)內(nèi)部寫入被調(diào)用函數(shù)了,而是需要傳入一個函數(shù)地址,至于該函數(shù)是如何調(diào)用如何來實現(xiàn)的,我們并不需要關(guān)心。

  從上面的分析來看,回調(diào)函數(shù)的使用并不是你傳給我,我調(diào)用你,而是還需要有一個起始的函數(shù)來調(diào)用系統(tǒng)函數(shù)或者中間函數(shù)將回調(diào)函數(shù)的地址作為參數(shù)給傳過去,可畫圖說明:

函數(shù)指針和回調(diào)函數(shù)的示例分析

圖中的虛線,如果中間函數(shù)是系統(tǒng)函數(shù),首先會由起始函數(shù)調(diào)用系統(tǒng)函數(shù)而由用戶態(tài)進入內(nèi)核態(tài)去由執(zhí)行操作系統(tǒng)的函數(shù),然后系統(tǒng)函數(shù)內(nèi)部會執(zhí)行調(diào)用用戶實現(xiàn)的一個callback函數(shù)而從內(nèi)核態(tài)再返到用戶態(tài)去執(zhí)行調(diào)用callback函數(shù),我個人認(rèn)為也可以這么理解回調(diào)函數(shù)的回調(diào)二字,因此虛線是用戶態(tài)和內(nèi)核態(tài)的一個劃分;但如果中間函數(shù)并不是系統(tǒng)函數(shù),那么就一直會在用戶態(tài)而不會接觸到系統(tǒng)內(nèi)部。

栗子時間:

#include <iostream>
using namespace std;

void print()
{
    //代碼
    cout<<"hello..."<<endl;
    //代碼
}

void say_hello(void (*pfun)(void))
{
    //代碼
    pfun();
    //代碼
}

int main()
{
    //代碼
    say_hello(print);
    //代碼
    return 0;
}

上面就是一個再簡單不過的小栗子,注釋掉的代碼就可以是用戶自己其他的實現(xiàn),而如果栗子中的say_hello函數(shù)是系統(tǒng)函數(shù)或者是別人傳過來的一個函數(shù)接口的話,其內(nèi)部實現(xiàn)我們是無法干涉和了解的,因此,只需要將我們希望執(zhí)行的回調(diào)函數(shù)地址給傳過去,從而完成我們需要回調(diào)函數(shù)來完成的任務(wù)就可以了。

以上是“函數(shù)指針和回調(diào)函數(shù)的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

另外有需要云服務(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)用場景需求。

當(dāng)前文章:函數(shù)指針和回調(diào)函數(shù)的示例分析-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://muchs.cn/article20/cdchjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號云服務(wù)器、網(wǎng)站制作、微信小程序商城網(wǎng)站、網(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)

商城網(wǎng)站建設(shè)