(c/c++) Function Pointer函式指標兩三事 ... - 草之程式小記
文章推薦指數: 80 %
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
延伸文章資訊
- 1C Language Pointer as Function Argument - Studytonight
- 2你所不知道的C語言:指標篇 - HackMD
void * 真的萬能嗎? 依據C99 規格6.3.2.3:8 [ Pointers ]. A pointer to a function of one type may be converte...
- 3(c/c++) Function Pointer函式指標兩三事 ... - 草之程式小記
Function Pointer (中文直譯「函式指標」),即為儲存某一個函式起始memory address的變數,此變數可以提供我們在之後進行呼叫。 乍聽之下,function ...
- 4Function pointer - Wikipedia
- 5Function pointers - C# 9.0 specification proposals
//This method has a managed calling convention. ... delegate Func1 Func2(Func1 f); // Function po...