溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

函數(shù)指針與回調(diào)函數(shù)

發(fā)布時(shí)間:2020-07-31 09:00:54 來(lái)源:網(wǎng)絡(luò) 閱讀:305 作者:凌若然 欄目:編程語(yǔ)言

一、函數(shù)指針

  1、  函數(shù)指針就是一個(gè)指針變量,用來(lái)指向函數(shù)地址。正在運(yùn)行的程序(進(jìn)程)在內(nèi)存中占據(jù)一定的空間。進(jìn)程包括編譯好的程序代碼和需要使用的變量。因此,程序代碼中的函數(shù)就是一些字符域,要得到一個(gè)函數(shù)地址,也就是得到這些字符域的起始地址。

    2、 函數(shù)指針的三種形式:
    指向普通C函數(shù)的函數(shù)指針        --- C語(yǔ)言中的函數(shù)指針
    指向C++類(lèi)靜態(tài)成員函數(shù)的函數(shù)指針    --- C++
    指向C++類(lèi)非靜態(tài)成員函數(shù)的函數(shù)指針   --- C++

    函數(shù)指針的本質(zhì)自然也就是函數(shù)地址。  類(lèi)成員函數(shù)的地址表示和普通C函數(shù)的地址是不一樣的。要表示一個(gè)類(lèi)例的成員函數(shù),光有函數(shù)地址還不夠,因?yàn)槊總€(gè)類(lèi)實(shí)例擁有一個(gè)非靜態(tài)成員函數(shù),而每個(gè)實(shí)例在內(nèi)存中都要占據(jù)一定的空間,所以, 非靜態(tài)類(lèi)成員函數(shù)的地址由兩部分組成,一 個(gè)是 實(shí)例地址,一個(gè)是 函數(shù)地址。實(shí)例地址通過(guò)隱含的this指針來(lái)傳遞。函數(shù)地址就是函數(shù)在實(shí)例所占內(nèi)存中的偏移地址,只不過(guò)這個(gè)地址通過(guò)函數(shù)名取得,并不需要關(guān)心其偏移具體的多少.

    靜態(tài)成員函數(shù)和 非靜態(tài)成員函數(shù)的區(qū)別:靜態(tài)成員函數(shù)并不是第個(gè)實(shí)例都擁有一個(gè)這樣的函數(shù)。所以,靜態(tài)成員函數(shù)的地址并不需要實(shí)例地址,也就是說(shuō),沒(méi)有this指針。其地址實(shí)質(zhì)上和普通的C函數(shù)地址是一樣的,只不過(guò)在定義函數(shù)指針時(shí)會(huì)有所不同。

   第一種和第三種的區(qū)別,兩者的區(qū)別:要得到一個(gè)類(lèi)實(shí)例的成員函數(shù)指向非靜態(tài)成員函數(shù)的函數(shù)指針需要一個(gè)隱含參數(shù):指向類(lèi)實(shí)例的this指針。而指向普通C函數(shù)的函數(shù)指針只需要得到函數(shù)地址既可。 這兩種類(lèi)型的函數(shù)指針是不兼容的(不可互相賦值)。


3、函數(shù)指針的定義:
    指向普通函數(shù)的指針:
    int (*pfun)(float, char, char) = NULL;                       // C

    指向類(lèi)成員函數(shù)的指針:
    int (myclass::*pmember)(float, char, char) = NULL;               // C++
    int (myclass::*pconstmember)(float, char,char) const = NULL;      // C++

    todo : 指向靜態(tài)成員函數(shù)的函數(shù)指針定義

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

 1、回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。如果把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用為調(diào)用它所指向的函數(shù)時(shí),我們就說(shuō)這是回調(diào)函數(shù)。

 2、使用回調(diào)函數(shù),需要:

  • 聲明

  • 定義

  • 設(shè)置觸發(fā)條件:在你的函數(shù)種把你的回調(diào)函數(shù)名稱(chēng)轉(zhuǎn)化為地址作為一個(gè)參數(shù),以便于系統(tǒng)調(diào)用。

    注:聲明和定義時(shí),回調(diào)函數(shù)由系統(tǒng)調(diào)用。

3、回調(diào)函數(shù):一個(gè)程序員不能顯示調(diào)用的函數(shù),通過(guò)將回調(diào)函數(shù)的地址傳給調(diào)用者從而實(shí)現(xiàn)調(diào)用。通過(guò)一個(gè)統(tǒng)一接口實(shí)現(xiàn)不同的內(nèi)容。




向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI