您好,登錄后才能下訂單哦!
一、函數(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)容。
免責(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)容。