C/C++中函數指針是一種指針類型,其指向一個函數的首地址。既然是指針類型,使用時就應該像int,int*等類型一樣申明定義。
如語句 int (*fp) (int, int); 就是聲明一個函數指針變量fp,其指向一個輸入為兩個int型參數,輸出為int型的函數。
對函數指針變量賦值可以有兩種方式。如有一個函數 int Add(int a, int b){return a+b;}。則可以定義:
1) fp=&Add;
2) fp=Add;
前一種方式是顯式賦值,后一種是隱式賦值。兩者是等同的。同樣在使用函數指針變量時也有兩種方式:
1)(*fp)(2,3);
2)fp(2,3);
兩者均相當於與執行Add(2,3),結果為5。
函數指針主要可以用於兩個場景中:菜單設計和函數參數。菜單設計中我們可以使用一個函數指針數組來表示幾種操作。另外函數指針變量也可以作為函數參數,C++中的endl操作符就是一個很好的例子,可以參考http://www.cnblogs.com/ldeng/archive/2012/09/02/2667942.html。
下面是一個完整的函數指針使用例子。其中包括函數指針的兩種定義方式和兩種使用方法。另外,display函數是函數指針作為函數參數的應用。簡易計算器體現了函數指針在菜單設計中的應用。
1 #include<iostream> 2 using namespace std; 3 4 5 int Add(int a, int b) 6 { 7 return a+b; 8 } 9 10 int Sub(int a, int b) 11 { 12 return a-b; 13 } 14 15 int Mul(int a, int b) 16 { 17 return a*b; 18 } 19 20 int Div(int a, int b) 21 { 22 if(b==0) 23 { 24 cout<<"Error!"<<endl; 25 exit(-1); 26 } 27 else 28 return a/b; 29 } 30 31 32 void Display() 33 { 34 cout<<"Function pointer can be a function parameter"<<endl; 35 } 36 37 void Test(void (*fp)()) 38 { 39 fp(); 40 } 41 42 43 44 int main() 45 { 46 int (*intfp)(int,int)=&Add; //explict 47 int (*intfp2)(int,int)=Add; //implict 48 cout<<intfp<<endl; 49 cout<<intfp2<<endl; 50 cout<<intfp(2,3)<<endl; //implict 51 cout<<(*intfp)(2,3)<<endl; //explict 52 53 Test(Display); //display is a funtion parameter 54 55 while(1) 56 { 57 int (*ope[4])(int a, int b)={Add,Sub,Mul,Div}; //here ope[] is an array, and each element is a function pointer. 59 int a,b; 60 int sel; 61 cout<<"Please input two integers: "; 62 cin>>a; 63 cin>>b; 64 cout<<"Please select the operation: "<<endl; 65 cout<<"1: +"<<endl; 66 cout<<"2: -"<<endl; 67 cout<<"3: *"<<endl; 68 cout<<"4: /"<<endl; 69 cout<<"0: End"<<endl; 70 cin>>sel; 71 if(sel<0 || sel>4) 72 cout<<"Error operation!"<<endl; 73 else if(sel==0) 74 break; 75 else 76 { 77 int result=ope[sel-1](a,b); 78 cout<<"The result is: "<<result<<endl; 79 } 80 } 81 return 0; 82 }
