【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 }
原文地址:https://www.cnblogs.com/wxiaoli/p/5556096.html