【C/C++】函数指针
首先必须要清楚如下:
【1】函数指针即函数的地址,也就是存储其机器语言代码的首地址。该地址用函数名表示。
【2】用具体的函数名给函数指针变量赋值时必须满足两者的类型(即函数返回值类型)和特征标(即函数参数表的个数及对应数据类型)相同。
然后,相关语法如下:
(1)函数指针变量pf的声明格式:返回类型 (*pf)(形参表);
(2)函数指针赋值格式:pf=函数名;//赋值运算符两边的指针和函数应满足【2】
(3)通过函数指针调用其指向的函数的格式:pf(实参表);
[NOTE]:关于(3)的调用格式语法也可写成:(*pf)(实参表);//虽然与(3)的写法在逻辑上似乎是矛盾的,但是C++是允许的。就像《C++ Primer Plus》里
//讲这个矛盾时的一句话说的:容忍逻辑上无法自圆其说的观点正是人类思维的特点。
//我个人比较喜欢用(3)的写法,因为这样用与“函数名本身表示函数的地址”这一点是对应的。
如:
int max(int*,int);
int (*pf)(int*,int);
pf=max;
max(arr,10);//用函数名调用函数
pf(arr,10);//用函数指针调用函数
//[NOTE] arr是int数组名。
完整示例函数:
1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 int max(int*,int); 7 int min(int*,int); 8 void callfun(int (*pf)(int*,int),int*);//函数指针作为函数形参 9 int p[10]={1,2,1,0,8,5,3,4}; 10 int (*pf)(int*,int);//声明函数指针 11 pf=max; 12 cout<<"max: "<<pf(p,10)<<endl;//通过函数指针pf调用函数max 13 pf=min; 14 cout<<"min: "<<pf(p,10)<<endl; 15 16 callfun(max,p);//函数名max为实参 17 callfun(min,p); 18 19 return 0; 20 } 21 //--------------------- 22 void callfun(int (*pf)(int*,int),int *p) 23 { 24 cout<<pf(p,10)<<endl; 25 } 26 int max(int *pa,int n) 27 { 28 int m; 29 m=pa[0]; 30 for(int i=0;i<n;i++) 31 if(pa[i]>m) 32 m=pa[i]; 33 return m; 34 } 35 36 int min(int *pa,int n) 37 { 38 int m; 39 m=pa[0]; 40 for(int i=0;i<n;i++) 41 if(pa[i]<m) 42 m=pa[i]; 43 return m; 44 }