(c/c++) Function Pointer函式指標兩三事 ... - 草之程式小記

文章推薦指數: 80 %
投票人數:10人

Function Pointer (中文直譯「函式指標」),即為儲存某一個函式起始memory address的變數,此變數可以提供我們在之後進行呼叫。

乍聽之下,function ... 跳到主要內容 (c/c++)FunctionPointer函式指標兩三事(FunctionPointer的typedef與ArrayofFunctionPointer) 取得連結 Facebook Twitter Pinterest 以電子郵件傳送 其他應用程式 7月07,2017  FunctionPointer 定義: FunctionPointer(中文直譯「函式指標」),即為儲存某一個函式起始memoryaddress的變數,此變數可以提供我們在之後進行呼叫。

乍聽之下,functionpointer就只是多一個別名再呼叫,似乎沒什麼實質的用處,但其實我們可以藉由functionpointer省去繁複的if/switch,後面會一一介紹。

使用方法:  現在假設我們有以下這個函式: intSquare(intn) {   returnn*n; } 然後宣告一個functionpointer變數,以便於指向函式Square: int(*fptr)(int); fptr=Square; 這邊有幾個小細節必須注意: 1.最前面的int是變數datatype(資料型態),和要指向的函式回傳值型態相同。

第一個小括號代表指標變數名稱,第二個小括號代表傳入的parameter資料型態們,且理所當然的type必須與我們要指向的函式傳入值相同。

2.functionpointer的pointeroperator(*)必須與變數名稱一起被小括號括起來並接參數的小括號。

若沒有這個小括號,會變成以下: int*fptr(int); 在意義上,表示fptr為一個"函式"而不是變數,回傳的資料型態為int*,會有3種情況;    a.回傳一個pointerofint(整數指標變數的指標)->int*a;returna;    b.回傳一個addressofint(整數一般變數的位址)->inta;return&a;    c.回傳一個intarray(整數型態的陣列)->inta[100];returna; 延伸: 在知道functionpointer的妙用前,還必須介紹以下兩種功能: 1.typedef typedef是c/c++中的關鍵字,其允許programmer為datatype(資料型態)創造一個全新的名字。

同時也可以為函式創造一個別名,其好處在於若要把function當做一參數傳入另外一fumction時,可以讓該參數簡略化。

這邊將其和functionpointer做結合: intMul(inta,intb) {   returna*b; }  int*FuncA(intx,inty,int(*Opt)(int,int)) {    returnOpt(x,y); }    intresult=FuncA(5,10,Mul);//第三個參數可以傳入更多不同的計算方法,因為是functionpointer 觀察FunctA,第三個帶入參數是一個functionpointer,只是長的有點醜,就可以用typedef做簡化,如下: typedefint(*MathMethod)(int,int);//注意*要在()之中   intMul(inta,intb) {   returna*b; } int*FuncA(intx,inty,MathMethodOpt) {    returnOpt(x,y); }    intresult=FuncA(5,10,Mul); 以上簡化是連同回傳型態也簡化,同時作為新的型態(別名)可供使用,可以理解為把 int(*)(int,int) 簡化成 MathMethod  但注意,function的typedef,不能寫成以下: typedefint(*)(int,int)MathMethod; 呈上,配合typedef就可以讓各種擁有不同功能function(上面是實做乘法,也可以增加除法等)更直觀的當做參數傳入其他function。

typedefint(*MathMethod)(int,int);   intMul(inta,intb){returna*b;} intDivide(inta,intb){returna/b;} intMinus(inta,intb){returna-b;} intAdd(inta,intb){returna+b;} int*Calc(intx,inty,MathMethodOpt){    returnOpt(x,y); }    intmain() {   inta=8,b=7;   printf("axb=%d\n",Calc(a,b,Mul));    printf("a/b=%d\n",Calc(a,b,Divide));   printf("a+b=%d\n",Calc(a,b,Minus));   printf("a-b=%d\n",Calc(a,b,Add)); } 2.ArrayofFunctionPointer 以上方法可以透過arrayoffunctionpointer(指標函式陣列),讓工作更加簡便。

所謂的arrayoffunctionpointer是一個儲存functionpointer的array,因此可以透過一些自訂的條件(例如輸入),去取得想要呼叫的function使用。

光說不練假把戲,直接上例子。

typedefint(*MathMethod)(int,int); intMul(inta,intb){returna*b;} intDivide(inta,intb){returna/b;} intMinus(inta,intb){returna-b;} intAdd(inta,intb){returna+b;} int(*calcArray[])(int,int)= //Arrayoffunctionpointer,存放會使用到的function名稱 {    Mul,  //這邊亦可以打&Mul,&可省略    Divide,    Minus,    Add }; char*operation[]= //做為判斷的自訂條件,與argv比對用 {    "x",    "/",    "-",    "+" }; intmain(intargc,char**argv) {    intsize=sizeof(calcArray)/(sizeof(int(*)));  //使用此方法可以避免每次增加功能時修改長度    inti=0;    if(argc>1)        for(i;i



請為這篇文章評分?