首先我們來宣告乙個函式。
int
max_int
(int a,
int b)
把函式名替換成指標表示式是建立指向函式指標最簡單的方式:
int (*pfun)(int a, int b); //宣告函式指標,此時函式指標沒有指向任何函式
這時,我們就已經完成了乙個最簡單的函式指標宣告,其意義是:生命了乙個函式指標,其指向的函式返回乙個int值,帶有兩個int型引數。
接下來我們對函式指標進行初始化:
pfun = max_int; //使函式指標指向max_int函式
這樣就完成了函式指標的初始化。接下來,我麼就可以通過此函式指標引用此函式。
int max;
int m =5;
int n =8;
max =
(*pfun)
(m,n)
;//使用函式指標引用max_int函式
max =
pfun
(m,n)
;//與上一句效果完全相同
printf
(「the max value is %d\n」, max)
;//print 『8』
ps:第四和第五句效果完全相同,編譯器都認識。
1)使用typedef宣告函式指標。
我們可以使用typedef來宣告函式,以使**的可讀性更強。
typedef
bool
(*pcopysdmmc2mem)
(int
,unsigned
int,
unsigned
short
,unsigned
int*
,bool
);
通過之前的介紹,我們可以知道,此函式指標可以指向「返回bool型,帶int, unsigned int, unsigned short, unsigned int*, bool型引數」 的函式。
藉此宣告,我們可以像宣告變數那樣同時建立多個函式指標。
pcopysdmmc2mem pf1, pf2;
2)使用define來定義函式指標
#define copysdmmctomem(z,a,b,c,e)(((bool(*)(int, unsigned int, unsigned short, unsigned int*, bool))(*((unsigned int *)0xd0037f98)))(z,a,b,c,e))
效果同上,但指定了指向函式的入口位址(0xd0037f98)
1)將函式作為引數傳遞給函式
相信大家中學的時候都學過積分。不知道還記不記得積分最原始的計算方法。
對,沒錯,無限細分,求面積。好的。我們接下來就給大家乙個應用函式指標有關積分計算的例子。
直接貼出**。
#include
//calculate用於計算積分。一共三個引數。第乙個為函式指標func,指向待積分函式。二三引數為積分上下限
double
calculate
(double
(*func)
(double x)
,double a,
double b)
return sum;
}double
func_1
(double x)
double
func_2
(double x)
void
main()
通過函式指標,我們可以在函式中使用別的函式作為引數。此程式可以完成對不同函式的積分。
2)引用不在**段中的函式
此功能在嵌入式系統中經常使用。我們知道,我們寫的使用者程式的code是存放在**段中的,在嵌入式系統中,一般情況下是存放在flash中的。什麼叫不在**段中的函式呢?很多微控制器在出廠前會將一些功能函式(系統函式)固化在rom中(類似於pc機中的bios),如flash擦寫功能,flash copy功能。而我們寫的**是不認識這些函式的,不能直接使用函式名呼叫。所以,當我們想在使用者程式中呼叫這些系統函式時,就只能使用函式指標的方式,通過將系統函式的入口位址傳給函式指標,來達到呼叫rom中程式的目的。這些系統函式一般都會在官方手冊中給出功能,返回值型別和引數列表。
從上我們可以分析出,此系統函式的入口位址為0xd0037f98。返回bool型,帶有int, unsigned int, unsigned short, unsigned int*, bool型五個引數。實際使用時,我們可以如下呼叫:
// 實際使用時
pcopysdmmc2mem p1 =
(pcopysdmmc2mem)
0xd0037f98;p1
(x, x, x, x, x)
;
傳入五個合適的引數即可。
函式指標說完了。我們接下來來看看函式指標陣列。
多了倆字,"陣列"前面四個字還一樣。那是不是就是有乙個陣列,用它來盛放函式指標。嗯,沒錯,就是這樣。
有了剛才的基礎,我直接給出例子。
void
(*funcpointerarray[3]
)(double x)
;//函式指標陣列
void
(*funcpointer)
(double x)
;//函式指標
兩個放在一起對比,函式指標陣列無非就像陣列宣告一樣,在後面加了而已。僅此而已。
那它怎麼用呢?
voidf1(
double x)
voidf2(
double x)
voidf3(
double x)
//來三個具體的函式,f1,f2,f3.
void
(*funcpointerarray[3]
)(double x)
;funcpointerarray[0]
=f1;
funcpointerarray[1]
=f2;
funcpointerarray[2]
=f3;
funcpointerarray[0]
(「2.333333」)
;funcpointerarray[1]
(「6.666666」)
;
簡直就和普通的陣列一模一樣。沒錯,無非他儲存的是函式指標而已。
最後,貼乙個用函式指標陣列的具體的應用的例子。
#include
void
additem
(char
*name)
void
deleteitem
(char
*name)
void
finditem
(char
*name)
void
updateitem
(char
*name)
void
main()
在上述的例子中,用函式指標陣列代替了大量的switch case 直接通過傳入的num值來呼叫不同的函式。
好了,相信講到這裡,大家應該清楚的明白什麼是函式指標和函式指標陣列了。
參考文章:
MSSQL escape的主要用途
title 生成測試資料 author wufeng4552 date 2009 09 22 09 27 36 declare t table test nvarchar 5 insert t select n 11 22 union all select n 11 33 union all sel...
python主要用途 python的主要用途是什麼
python主要的五大應用介紹 一 web開發 python的誕生歷史比web還要早,由於python是一種解釋型的指令碼語言,開發效率高,所以非常適合用來做web開發。python有上百種web開發框架,有很多成熟的模板技術,選擇python開發web應用,不但開發效率高,而且執行速度快。二 網路...
Java泛型的主要用途
1.泛型的主要用途就是代替各種型別,作為乙個籠統的整體型別代替,也就是代替引數,不論是傳入引數還是返回引數。都可以用泛型來代替。如dao操作類的增刪改查操作,因為傳入引數的型別不同,但基本都是相同介面,所以就可以只寫乙個dao操作類的增刪該查方法,其傳入引數用泛型代替。如 public intupd...