顧名思義,指標函式
即返回指標的函式。
其一般定義形式如下:
型別名*
函式名(函式引數表列);
其中,字尾運算子括號「()」
表示這是乙個函式,其字首運算子星號「
*」表示此函式為指標型函式,其函式值為指標,即它帶回來的值的型別為指標,當呼叫這個函式後,將得到乙個「指向返回值為
…的指標(位址),「型別名」表示函式返回的指標指向的型別」。 「
(函式引數表列)
」中的括號為函式呼叫運算子,
在呼叫語句中,即使函式不帶引數,其參數列的一對括號也不能省略。其示例如下:
int *pfun(int, int);
由於「*」的優先順序低於「
()」的優先順序,因而
pfun
首先和後面的「
()」結合,也就意味著,
pfun
是乙個函式
。即:int *(pfun(int, int));
接著再和前面的「
*」結合,說明這個函式的返回值是乙個指標。由於前面還有乙個
int,也就是說,
pfun
是乙個返回值為整型指標的函式。
我們不妨來再看一看,指標函式與函式指標有什麼區別?
int (*pfun)(int, int);
通過括號強行將
pfun
首先與「
*」結合,也就意味著,
pfun
是乙個指標,
接著與後面的「
()」結合,說明該指標指向的是乙個函式,然後再與前面的
int結合,也就是說,該函式的返回值是
int。由此可見,
pfun
是乙個指向返回值為
int的函式的指標。
雖然它們只有乙個括號的差別
,但是表示的意義卻截然不同。函式指標的本身是乙個指標,指標指向的是乙個函式。指標函式的本身是乙個函式,
其函式的返回值是乙個指標
。 在上面提到的指標函式裡面,有這樣一類函式,它們也返回指標型資料(位址),但是這個指標不是指向
int、
char
之類的基本型別,而是指向函式。對於初學者,別說寫出這樣的函式宣告,就是看到這樣的寫法也是一頭霧水。
比如,下面的語句:
int (*ff(int))(int *, int);
我們用上面介紹的方法分析一下,
ff首先與後面的「()
」結合,即:
int (*(ff(int)))(int *, int);
//用括號將
ff(int)
再括起來
也就意味著,ff
是乙個函式。
接著與前面的「*
」結合,說明
ff函式的返回值是乙個指標。然後再與後面的「()
」結合,也就是說,該指標指向的是乙個函式。
這種寫法確實讓人非常難懂,以至於一些初學者產生誤解,認為寫出別人看不懂的**才能顯示自己水平高。而事實上恰好相反,
能否寫出通俗易懂的**是衡量程式設計師是否優秀的標準
。一般來說,用
typedef
關鍵字會使該宣告更簡單易懂。在前面我們已經見過:
int (*pf)(int *, int);
也就是說,pf是乙個函式指標「變數」。當使用typedef宣告後,則pf就成為了乙個函式指標「型別」,即:
typedef int (*pf)(int *, int);
這樣就定義了返回值的型別。
然後,再用
pf作為返回值來宣告函式:
pf ff(int);
下面將以
程式清單
1為例,說明用函式指標作為函式的返回值的用法。當程式接收使用者輸入時,如果使用者輸入
d,則求陣列的最大值,如果輸入
x,則求陣列的最小值,如果輸入
p,則求陣列的平均值。
程式清單
1求最值與平均值示例
#include#include double getmin(double *dbdata, int isize) // 求最小值
}return dbmin;
}double getmax(double *dbdata, int isize) // 求最大值
{double dbmax;
int i;
assert(isize>0);
dbmax=dbdata[0];
for (i=1; i0);
for (i=0; i
上述程式中前面
4個函式分別實現求最大值、最小值、平均值和未知演算法,然後實現了
getoperation
函式。這個函式根據字元的返回值實現上面
4個函式。它是以函式指標的形式返回的,從後面的
main
函式的getoperation(c)(dbdata, is
ize)
可以看出,通過這個指標可以呼叫函式。
深入理解指標函式
1.指標函式的定義 顧名思義,指標函式即返回指標的函式。其一般定義形式如下 型別名 函式名 函式引數表列 其中,字尾運算子括號 表示這是乙個函式,其字首運算子星號 表示此函式為指標型函式,其函式值為指標,即它帶回來的值的型別為指標,當呼叫這個函式後,將得到乙個 指向返回值為 的指標 位址 型別名 表...
深入理解函式指標
指標型函式 函式型別 函式名 形參定義表 int fun int x,int y 函式指標 函式型別 函式指標名 形參表 int fun int x,int y 函式指標陣列 函式型別 函式指標名 陣列元素個數 形參表 int fun 10 int x,int y 上面是定義了乙個指標陣列,陣列元素...
深入理解C C 函式指標
函式指標陣列的妙用 筆者在開發某軟體過程中遇到這樣乙個問題,前級模組傳給我二進位制資料,輸入引數為 char buffer和 int length,buffer是資料的首位址,length表示這批資料的長度。資料的特點是 長度不定,型別不定,由第乙個位元組 buffer 0 標識該資料的型別,共有2...