1.函數指針的使用
int fun(int a,int b); //聲明一個函數 int (*p)(int,int) //定義函數指針,p是一個函數指針,最前面的int是所指函數的返回值類型,後面括號裡是該函數的返回值類型 //給函數指針賦值 p=fun; //p指向名為fun的函數 p=&fun; //和p=fun等價 //函數調用的幾種等價形式 int a=p(1,2); int b=(*p)(1,2); int c=fun(1,2);
2.函數指針定義的幾種形式
定義指向int fun(int a,int b)的函數指針
1)直接定義:
int (*p)(int,int);
p=fun; //或p=&fun
2)使用typedef定義類型別名:
//p1,p2是函數指針類型
typedef int (*p1)(int,int);
typedef decltype(fun) *p2;
p1 f1=fun; //這裡p1是函數指針類型,需要定義具體函數指針對象f,f是指向函數的指針
p2 f2=fun; //同上
//這裡p1,p2是函數類型,
typedef int p1(int,int);
typedef decltype(fun) p2;
p1 *f1=fun; //f1是函數指針
p2 *f2=fun; //f2是函數指針
3)使用using定義類型別名
using p1=int (*)(int,int); //p1是函數指針類型
using p2=int(int,int); //p2是函數類型
p1 f1=fun; //f1是函數指針
p2 *f2=fun; //f2是函數指針
3.函數指針形參
1)函數名做形參,函數名會自動轉換成函數指針
#include <iostream> using namespace std; int sum(int a,int b) { return a+b; } void fun(int(*p)(int,int)) { cout << p(2, 3) << endl; } int main(int argc,char *argv[]) { fun(sum); //sum自動轉換成函數指針 return 1; }
2)定義函數類型別名
#include <iostream> using namespace std; int sum(int a,int b) { return a+b; } typedef int f(int, int); void fun(f p) //f是函數類型,做形參自動轉換成函數指針類型 { cout << p(2, 3) << endl; } int main(int argc,char *argv[]) { fun(sum); //這裡sum轉換成函數指針 return 1; }
3)定義函數指針別名
#include <iostream> using namespace std; int sum(int a,int b) { return a+b; } typedef int(*f)(int, int); void fun(f p) //f是函數指針類型,p是函數指針 { cout << p(2, 3) << endl; } int main(int argc,char *argv[]) { fun(sum); //sum自動轉換成函數指針 return 1; }
4.返回指向函數的指針
1)直接定義
int (*f(int))(int,int) //f(int) 是函數名和形參列表,返回值類型是int(*)(int,int)
2)采用尾置返回方式
auto f(int)->int(*)(int,int)
3)使用類型別名定義函數指針類型
tpyedef int(*p1) (int,int); using p2=int(*)(int,int); typedef int p3(int,int); using p4=int(int,int); //等價聲明 p1 f(int); p2 f(int); p3 *f(int); p4 *f(int);