C++把函數A作為參數傳遞給另外函數B時,實際上是把函數A作為指針傳遞給另外的函數B,這就涉及到了函數指針。
1.函數指針
函數指針聲明如下:
return_type (*p_name)(arg_list); //表示返回值為return_type,參數列表為arg_list的函數指針p_name.
例如:
//定義一個函數
int add(int a,int b) { return a+b; }
int (*pfun)(int,int);//聲明一個函數指針
pfun = add;//使用函數指針指向一個函數,此處是函數名
注意:函數指針的參數類型和返回類型必須與指向的函數參數類型返回類型一致
2.使用函數指針代替函數使用
int res = pfun(1,2);//使用函數指針調用函數add
3.函數指針作為函數參數傳遞
函數A作為參數傳遞給函數B時,函數B聲明如下:
int A(int a,int b);
B(arg_list,int (*pA)(int, int));
函數B調用如下:
B(...,A);
例子:
int CmpAsc(int x, int y) { //如果x>y返回1,否則返回0; if(x>y)return 1; else return 0; } void sort(int a[], int n, int (*cmp)(int,int))//最后一個參數為函數指針類型參數 { /*對數組a排序,排序原則由cmp指定,若cmp為真,表示兩元素逆序*/ for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) if(cmp(a[i],a[j]))//調用傳進來的函數指針 swap(a[i],a[j]); } int main(int argc, const char * argv[]) { // insert code here... int a[6] ={8,2,1,3,4,5}; sort(a, 6, CmpAsc);//CmpAsc函數名作為參數傳遞給函數sort for(auto &e:a) cout<<e<<" "; return 0; }