C語言中函數(shù)指針與普通指針沒什么差別,只是指向的內(nèi)容不同而已。主要作用:
在興化等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷,成都外貿(mào)網(wǎng)站制作,興化網(wǎng)站建設(shè)費(fèi)用合理。
1、實(shí)現(xiàn)面向?qū)ο缶幊讨械亩鄳B(tài)性。
2、回調(diào)函數(shù)。
函數(shù)指針是指向函數(shù)的指針變量。因此“函數(shù)指針”本身首先應(yīng)是指針變量,只不過該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。
C在編譯時(shí),每一個(gè)函數(shù)都有一個(gè)入口地址,該入口地址就是函數(shù)指針?biāo)赶虻牡刂贰S辛酥赶蚝瘮?shù)的指針變量后,可用該指針變量調(diào)用函數(shù),就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。
函數(shù)指針有兩個(gè)用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。
函數(shù)指針是指向函數(shù)的指針變量。 因而“函數(shù)指針”本身首先應(yīng)是指針變量,只不過該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。
函數(shù)指針有兩個(gè)用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。
函數(shù)指針的聲明方法為:
返回值類型 ( *?指針變量名) ([形參列表]);
如:
int func(int x); /* 聲明一個(gè)函數(shù) */
int (*f) (int x); /* 聲明一個(gè)函數(shù)指針 */
f=func; /* 將func函數(shù)的首地址賦給指針f */
或者使用下面的方法將函數(shù)地址賦給函數(shù)指針:
f = func;
賦值時(shí)函數(shù)func不帶括號,也不帶參數(shù),由于func代表函數(shù)的首地址,因此經(jīng)過賦值以后,指針f就指向函數(shù)func(x)的代碼的首地址。
下面的程序說明了函數(shù)指針調(diào)用函數(shù)的方法:
#includestdio.h
int?max(int?x,int?y){return?(xy??x:y);}
int?main()
{
int?(*ptr)(int,?int);
int?a,?b,?c;
ptr?=?max;
scanf("%d%d",?a,?b);
c?=?(*ptr)(a,b);
printf("a=%d,?b=%d,?max=%d",?a,?b,?c);
return?0;
}
函數(shù)的調(diào)用必須是已知文件名的。如果你寫一個(gè)系統(tǒng)的某一層,不知道其他層的內(nèi)部情況,這時(shí)候用指針傳遞函數(shù)最合適。還有,結(jié)構(gòu)體里包含指向函數(shù)的指針,就相當(dāng)于一個(gè)簡單的“對象”了。
看看linux內(nèi)核里各接口的定義。函數(shù)指針的使用使的內(nèi)核可以很多人同時(shí)開發(fā),并且大家只需要知道相應(yīng)的接口就可以了。這套框架,離不開函數(shù)指針。
上面的話是有道理的。只是,要真的體會這些名詞,需要你親歷躬行,一個(gè)“百度知道”是很難讓你真正體會并理解的。國人一些教科書也不負(fù)責(zé)任,人云亦云的說這些話,但很少能透徹講解。我小試一下。
1. 便于分層設(shè)計(jì):函數(shù)指針是引用,是間接層,或曰隔離層。它輸出到上層,給上層用戶用。函數(shù)實(shí)體是實(shí)現(xiàn),在下層,給開發(fā)者用,實(shí)現(xiàn)者(軟件工程師)關(guān)注。這就是簡單的分層的概念了。上層用戶想讓一個(gè)函數(shù)所做的東西會變化時(shí),我們只需要改變底層實(shí)現(xiàn),并用函數(shù)指針指向新的實(shí)現(xiàn)就行了。
再精煉一下分層:分層的核心是對接口進(jìn)行設(shè)計(jì)和實(shí)現(xiàn)。函數(shù)指針的作用就是提供不同實(shí)現(xiàn)的統(tǒng)一接口。
2. 利于系統(tǒng)抽象:只有存在多個(gè)類似的實(shí)體需要模擬、操作或控制時(shí)(這種情況很多)才需要抽象。多個(gè)類似的實(shí)體就是對象,抽象的結(jié)果就是類。在C里邊,可以用函數(shù)指針數(shù)組完成這種抽象。如, fopen 就是一個(gè)例子。他可以打開文件。C里面將磁盤文件、串口、USB等諸多設(shè)備抽象為文件。
3. 降低耦合度以及使接口與實(shí)現(xiàn)分開:第1條中的解釋已經(jīng)說明了這一點(diǎn)。
再具體一下:
我曾搭建過一個(gè)嵌入式平臺。其中的設(shè)備操作(硬件驅(qū)動(dòng))采用了多組函數(shù)指針數(shù)據(jù),并進(jìn)行了簡單的封裝,其結(jié)果是:
業(yè)務(wù)軟件使用函數(shù)指針數(shù)組的封裝函數(shù)訪問設(shè)備。這個(gè)封裝可展示為:
int DevOpen(char *strDevName);
int Write(int DevID, char* DataFrom, int StartDevAddr, int DataLong);
int Read(int DevID, char* DataTo, int StartDevAddr, int DataLong);
int DevClose(int DevID);
這組抽象出來的函數(shù),是一組語義清晰且穩(wěn)定的上層接口,為上層的業(yè)務(wù)開發(fā)團(tuán)隊(duì)使用。底層的驅(qū)動(dòng)層,各自實(shí)現(xiàn)自己的設(shè)備打開、讀、寫及關(guān)閉代碼,然后,注冊自己的設(shè)備到系統(tǒng)列表里。上層業(yè)務(wù)接可以使用了。期間的耦合在這里:
int Write(int DevID, char* DataFrom, int StartDevAddr, int DataLong)
{
/* Error detecting. */
return DevWrite[ DevID ]( char* DataFrom, int StartDevAddr, int DataLong );
}
其中,DevWrite[ DevID ]就是一個(gè)函數(shù)指針數(shù)組:
int (*DevWrite)[ MAX_DEV_NUM ]( char*,int,int ) = {0};
里面放的就是多個(gè)設(shè)備的寫的操作。其中包括:UART,RTC,WatchDog。EEPROM,DigitalInput,DigitalOutput,Key,LCD,LED。
好了。說的太多了。如需要學(xué)習(xí),可郵件livefuture@163點(diǎn)抗 。
但愿對你有所幫助。