函數(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ǎng)站制作、成都網(wǎng)站設計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元建安做網(wǎng)站,已為上家服務,為建安各地企業(yè)和個人服務,聯(lián)系電話:18982081108

一. 函數(shù)指針

  關(guān)于函數(shù)指針的概念,可以想到一個整型指針指向的是一個整型,它的值是所指向?qū)ο蟮牡刂罚灰粋€字符串指針指向的是一個字符串,它的值是所指向字符串的首地址;因此,一個函數(shù)指針當然是一個指針變量了,它所指向的是一個函數(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ù)和返回值一一對應

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

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

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

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

  上面談論的函數(shù)指針其實就是在為談回調(diào)函數(shù)做鋪墊,什么是回調(diào)函數(shù)?其實回調(diào)函數(shù)就是函數(shù)指針的一種使用,用戶自己定義一個函數(shù),將這個指向這個函數(shù)的函數(shù)指針作為參數(shù)傳遞給一個系統(tǒng)函數(shù)或者中間函數(shù),當這個系統(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ù)借口呢?再如果有一種設計需求,要求執(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ù),我個人認為也可以這么理解回調(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ù)來完成的任務就可以了。

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

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

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

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信公眾號云服務器網(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)站建設
主站蜘蛛池模板: 亚洲av无码一区二区三区网站| 人妻精品久久无码专区精东影业| 国产aⅴ激情无码久久| 久久久无码一区二区三区| 亚洲精品无码久久久久久| 岛国av无码免费无禁网站| 亚洲精品无码久久久| 蜜芽亚洲av无码精品色午夜| 国产无码一区二区在线| 无码h黄肉3d动漫在线观看| 亚洲爆乳无码专区| 国产亚洲?V无码?V男人的天堂| 无码人妻丰满熟妇啪啪网站牛牛 | YY111111少妇无码理论片| 久久久亚洲精品无码| 东京热加勒比无码少妇| 久久伊人中文无码| 国产精品亚洲一区二区无码| 日韩精品无码区免费专区| 日韩AV无码中文无码不卡电影| 亚洲精品无码av人在线观看| 精品人妻少妇嫩草AV无码专区| 久久久无码精品人妻一区| 午夜麻豆国产精品无码| 亚洲中文字幕久久精品无码2021| 亚洲AV无码欧洲AV无码网站| 无码国内精品久久人妻麻豆按摩 | 亚洲 无码 在线 专区| 亚洲aⅴ天堂av天堂无码麻豆| 啊灬啊别停灬用力啊无码视频| 亚洲AV无码成人网站久久精品大| 国产亚洲精久久久久久无码| 中文字幕无码第1页| 国产成人精品无码一区二区| 国精品无码一区二区三区左线 | 无码人妻精品一区二区三区久久 | 丰满爆乳无码一区二区三区| 无码国产精品一区二区免费I6| 久久久久久亚洲精品无码| 无码8090精品久久一区| 亚洲av无码成人精品区在线播放|