學(xué)習(xí)了數(shù)組之后,我們知道數(shù)組是在內(nèi)存中申請一塊內(nèi)存空間;數(shù)組名代表內(nèi)存塊的首地址,通過數(shù)組名可以訪問內(nèi)存塊中的數(shù)據(jù)。
我們提供的服務(wù)有:成都網(wǎng)站制作、成都做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、江陵ssl等。為成百上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的江陵網(wǎng)站制作公司
那么,對于函數(shù),它也是存放在內(nèi)存塊中的一段數(shù)據(jù)。例如下面的函數(shù):
void func( int a )
{
printf( "in func, a = %d " , a );
}
此時(shí),定義了一個(gè)函數(shù)名是func的函數(shù)??梢匀缦抡{(diào)用該函數(shù):
func(100);
此時(shí),就進(jìn)入了func函數(shù)的函數(shù)體中執(zhí)行??梢钥吹?, 函數(shù)名如同數(shù)組名一樣,代表函數(shù)所在內(nèi)存塊的首地址 。通過數(shù)組名可以訪問數(shù)組在內(nèi)存塊中申請的內(nèi)存,同理,通過函數(shù)名,可以訪問函數(shù)在內(nèi)存中存放的數(shù)據(jù)。
所以,函數(shù)名就代表了該函數(shù)在內(nèi)存塊中存放的首地址。那么,函數(shù)名是表示一個(gè)地址,就可以把這個(gè)地址值存放在某一個(gè)指針變量中,然后,通過指針變量訪問函數(shù)名指向的函數(shù)。
在C語言中,提供了函數(shù)指針變量,可以存放函數(shù)名表示的地址。函數(shù)指針變量的定義格式如下:
返回?cái)?shù)據(jù)類型 (*函數(shù)指針變量名)(形參列表)
對比函數(shù)的定義如下:
返回?cái)?shù)據(jù)類型 函數(shù)名(形參列表)
可以看到,函數(shù)指針變量的定義,與函數(shù)的定義格式基本一樣,唯一的區(qū)別是把“函數(shù)名”轉(zhuǎn)換為“*(函數(shù)指針變量名)”;總結(jié)如下:
(1) 使用指針降級運(yùn)算符*來定義,表示這個(gè)是一個(gè)指針。
(2) 指針降級運(yùn)算符*不可以靠近返回?cái)?shù)據(jù)類型,例如“返回?cái)?shù)據(jù)類*”就表示函數(shù)的返回類型是一個(gè)指針。那么,為了讓指針降級運(yùn)算符*能夠修飾函數(shù)指針變量,就用小括號()把指針降級運(yùn)算符*與函數(shù)指針變量名包含起來。
定義了函數(shù)指針變量之后,可以把函數(shù)名賦給函數(shù)指針變量。因?yàn)?,函?shù)名就表示函數(shù)在內(nèi)存塊中的首地址,所以,可以直接把一個(gè)地址賦值給函數(shù)指針變量。格式如下:
函數(shù)指針變量 = 函數(shù)名;
最終,可以通過函數(shù)指針變量調(diào)用函數(shù),調(diào)用的格式與通過函數(shù)名調(diào)用完全一樣,通過函數(shù)指針變量調(diào)用函數(shù),有如下形式:
方法1:函數(shù)指針變量(實(shí)參列表);
方法2:(*函數(shù)指針變量名)(實(shí)參列表);
很多情況下,我們更傾向于使用第一種形式,因?yàn)?,它的使用方式更接近于通過函數(shù)名調(diào)用函數(shù)。
下面根據(jù)程序測試?yán)觼砜纯丛趺礃討?yīng)用函數(shù)指針變量。
深入學(xué)習(xí),可以交個(gè)朋友,工人人人號:韋凱峰linux編程學(xué)堂
程序運(yùn)行結(jié)果如下:
深入學(xué)習(xí),可以交個(gè)朋友,工人人人號:韋凱峰linux編程學(xué)堂
可以看到,我們定義了func函數(shù)和函數(shù)指針變量pfunc,然后,把函數(shù)名func設(shè)置給函數(shù)指針變量pfunc,最終,通過函數(shù)指針變量pfunc調(diào)用函數(shù)。
因?yàn)楹瘮?shù)指針變量存放的就是函數(shù)名表示的地址,所以,函數(shù)指針變量與函數(shù)名一樣,可以直接通過函數(shù)指針變量調(diào)用函數(shù)。
注意:我們在學(xué)習(xí)指針的時(shí)候,可以把一個(gè)int類型的變量地址賦值給int類型的指針;但是,不可以把int類型變量的地址,賦值給double類型的指針。這就是變量數(shù)據(jù)類型不一致的問題。
同樣的道理,定義函數(shù)的時(shí)候,函數(shù)的返回?cái)?shù)據(jù)類型和形參列表都不一樣,所以,函數(shù)指針變量能夠接收的函數(shù)名,它們定義的 函數(shù)返回?cái)?shù)據(jù)類型和形參列表必須一致 ,此時(shí),就如同變量與指針變量類型一致時(shí),才可以把變量的地址賦值給指針變量一樣。
如下是一個(gè)測試?yán)樱?/p>
深入學(xué)習(xí),可以交個(gè)朋友,工人人人號:韋凱峰linux編程學(xué)堂
程序編譯結(jié)果如下:
深入學(xué)習(xí),可以交個(gè)朋友,工人人人號:韋凱峰linux編程學(xué)堂
可以看到,我們把func函數(shù)的形參列表修改為double,但是,函數(shù)指針變量pfunc定義的形參列表為int類型,此時(shí),函數(shù)和函數(shù)指針變量的定義格式不一致,所以,不可以把函數(shù)名表示的地址設(shè)置給函數(shù)指針變量。我們來總結(jié)一下:
(1) 在Ubuntu系統(tǒng)中,使用GCC編譯,提示warning警告,但是,程序可以編譯通過,可以運(yùn)行。
(2) 在Windows系統(tǒng)中,使用Visual Studio工具,無法編譯該代碼,提示類型不一致。
(3) 從代碼的嚴(yán)謹(jǐn)方面來說,是不可以設(shè)置類型不一致的數(shù)據(jù)。所以,我們應(yīng)該編寫嚴(yán)謹(jǐn)?shù)拇a,函數(shù)定義的類型,與函數(shù)指針類型不一致的時(shí)候,不可以把函數(shù)名,賦值給函數(shù)指針變量。
函數(shù)指針變量的定義很重要,我們需要牢記和理解它們使用的方式。下面多舉幾個(gè)例子說明函數(shù)指針變量的定義和使用。
int func( void );
int (*pfunc)( void );
pfunc = func;
此時(shí),定義func函數(shù),它的返回值類型是int類型,形參列表是void,那么,定義pfunc函數(shù)指針變量的時(shí)候,它的返回值類型與形參列表都必須與func一樣。
char * func1( int x, int y, int x);
char * (*pfunc1)( int , int , int );
pfunc1 = func1;
char * (*pfunc1)( int x, int y, int x);
我們再總結(jié)一下:
(1) 函數(shù)名表示函數(shù)在內(nèi)存塊中的首地址,可以直接把函數(shù)名賦值給函數(shù)指針變量;
(2) 定義函數(shù)指針變量的時(shí)候,函數(shù)返回?cái)?shù)據(jù)類型和形參列表必須與要指向函數(shù)的定義一致;
void*?f(int);?//一個(gè)指針函數(shù)f
void*(*p)(int)?=?f;?//一個(gè)指向f的函數(shù)指針p
1
typedef int (*Fptr)(int , int );
Fptr fptr = NULL; (此處的Fptr是數(shù)據(jù)類型?)
使用了typedef,F(xiàn)ptr就是數(shù)據(jù)類型,代表int (*XXX)(int , int );這一堆
如果寫成Fptr fptr,意思就是int (*fptr)(int , int );了
你的理解沒有錯(cuò),F(xiàn)ptr就是返回值是int,參數(shù)是兩個(gè)int的函數(shù)指針類型,fptr才是函數(shù)指針變量
2
int (*Fptr)(int , int ) ;
Fptr = NULL; (此處的Fptr是函數(shù)指針變量?)
Fptr就是一個(gè)返回值是int,參數(shù)是兩個(gè)int的函數(shù)指針變量了
針對你的: void kk(void) { cout "kk " endl; } 或其相同原型的函數(shù)作如下聲明: typedef void(*FuncKk)(void);//FuncKk是這一原型函數(shù)的指針類型; 這樣你可以在你的程序中如下: int main() { FuncKk _pfunc = kk;//定義一個(gè)FuncKk型的函數(shù)指針并初始化; _pfunc();//用該函數(shù)指針調(diào)用kk函數(shù) _PAUSE; return 0; } 上述程序行為良好,體現(xiàn)出標(biāo)準(zhǔn)的函數(shù)指針使用方法,即使用typedef聲明函數(shù)指針的類型而不是函數(shù)指針變量,好處是一處聲明,到處都可以使用而避免多次使用函數(shù)指針冗長的語法,還有typedef固有的靈活性。
文章標(biāo)題:c語言如何定義個(gè)函數(shù)指針,c語言定義函數(shù)指針類型
網(wǎng)頁路徑:http://jinyejixie.com/article30/dsecgpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、App開發(fā)、全網(wǎng)營銷推廣、企業(yè)網(wǎng)站制作、虛擬主機(jī)、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)