函式指標也叫指向函式的指標,它是為了提高函式的通用性而引入的。比較傳統的方法是在函式中增加引數,通過增加的引數來判斷到底要用什麼函式,這樣的缺點是靈活性差,為了支援多種方法要在函式中要寫很多分支判斷語句。比如,你要計算乙個函式值(如sin x,log10 x)的平方,按照傳統的方法你可以這樣寫這個函式:
public double fuction(double param,int functionselection)
顯然,這種方法很費事,造成函式體很長。所以,函式指標的思想很重要。大家可能很熟悉c++中的ddp函式指標型別,那麼,在完全物件導向的c#語言中函式指標是什麼樣子的呢?
在c#中我們使用delegate(委託)關鍵字來實現函式指標。
在《.net framework essential》中有乙個經典的例子:
using system;
namespace testdelegate
public static void main() }
} 上面的例子注釋說明了實現函式指標所要做的工作,我們發現在delegate void msghandler(string strmsg)一句中的引數是字串型的,說明能夠指向的函式也必須只有乙個字串引數,而msghandler f=new msghandler(t.onmsg);中是把t.onmsg這個函式直接傳遞給f。這個例子過於簡單,但是已經說明函式指標的用法。我們不妨解決一下前面提出的計算不同函式值的平方的問題。
首先定義乙個函式委託(指標):
delegate double doublehandler(double d_parm);
這相當於在c++定義函式指標型別。
第二步定義**函式就免了,因為我們可以使用math.sin函式和math.log10函式,但是我們必須定義乙個函式來求平方:
public static double mathmethod(double parm1)
這個函式和前面那個加引數的函式相比簡單多了,但更具有通用性。
下面要做的就是要給前面定義的函式指標型別(即函式委託)建立物件並對其用函式將它初始化了:
doublehandler doublemethod=new doublehandler(math.sin);
大家已經看到了,這個指標指向了math.sin函式,相當於c++中的完成了對函式指標型別的「賦值」(初始化)。大家也可以通過新增doublemethod=new doublehandler(math.log10);重新初始化來改變函式指標的指向的函式物件。
最後就是計算函式值的平方了:
double d=mathmethod(doublemethod(.5);
以下是完整的程式,在visual studio.net 2003下除錯通過:
using system;
namespace testdelegate
",strmsg);}
public static double mathmethod(double parm1)
public static void main()
;foreach(doublehandler handle in doublemethod)}}
} 上面的例子很能說明問題,有意識的使用c# delegate程式設計實現函式指標,能夠有效的簡化**,提高函式的通用性。 (完)
C 中的函式指標
在c 中,指標變數可以指向普通變數 字串和陣列等,同時也可以指向函式,因為乙個函式在編譯時被分配乙個入口位址,這個入口位址即為該函式的指標。所以,可以用指標變數指向函式,然後通過該指標變數呼叫此函式。在c 中,函式的名稱就代表了一般定義形式為 資料型別表示符 指標變數名 例如 int p 程式示例 ...
C 中的指標 二 函式指標
原帖及討論 http bbs.bc cn.net dispbbs.asp?boardid 56 id 92806 先說一下c式的函式 指標。這種函式 指標的應用十分廣泛。對於任何函式 void print string s 它的指標這樣定義 void pfun string null pfun pr...
C 中函式指標的使用
在c c 中存在著函式指標,即指向函式的指標。我目前已知的兩種使用方法是 include include typedef int pinnt define pp int int funca int a,int b int funcb int a,int b int main int argc,cha...