CPP学习之——函数指针也可以作为函数的参数(17.7)

一 概述

既然指针可以作为函数的参数,那么指向某个函数的指针为什么就不可以呢?

二 函数指针

函数指针作为函数的参数的一般形式为

1
void func(void(*p)(int&,int&),int&,int&);
  • 该函数func有三个参数,第一个参数void(*p)(int&,int&)是个函数指针,它指向一个带有两个Int型参数并且返回void值的函数,另外两个参数都是Int型引用

三 示例演示及结果输出

3.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<iostream>
using namespace std;
void square(float&x,float&y){x=x*x;y=y*y;}
void cube(float&x,float&y){x=x*x*x;y=y*y*y;}
void print(void(*p)(float&x,float&y),float&x,float&y)
{
cout<<"执行函数前"<<endl;
cout<<"x:"<<x<<"\t"<<"y:"<<y<<endl;
p(x,y);
cout<<"执行函数后"<<endl;
cout<<"x:"<<x<<"\t"<<"y:"<<y<<endl;
}
void swap(float&x,float&y){float z;z=x;x=y;y=z;}
int main()
{
float a=2,b=3;
char choice='0';
int i;
void (*p[5])(float&x,float&y);
for( i=0;i<5;i++)
{
cout<<"(0)退出(1)正方(2)立方(3)交换x和y的值:";
cin>>choice;
bool quit=false;
switch(choice)
{
case '0':
quit=true;
break;
case '1':
p[i]=square;
break;
case '2':
p[i]=cube;
break;
case '3':
p[i]=swap;
break;
default:
p[i]=0;
break;
}
if(quit)
break;
if(p[i]==0)
{
cout<<"请输入一个从0到3之间的数字"<<endl;
i=i-1;
continue;
}
print(p[i],a,b);
}
return 0;
}

3.2 输出结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(0)退出(1)正方(2)立方(3)交换x和y的值:1
第1次执行,到第5次结束
初始值
长:2宽:3
现在调用函数指针数组p[0]所指向的函数...
运算后
长:4宽:9
(0)退出(1)正方(2)立方(3)交换x和y的值:2
第2次执行,到第5次结束
初始值
长:4宽:9
现在调用函数指针数组p[1]所指向的函数...
运算后
长:64宽:729
(0)退出(1)正方(2)立方(3)交换x和y的值:3
第3次执行,到第5次结束
初始值
长:64宽:729
现在调用函数指针数组p[2]所指向的函数...
运算后
长:729宽:64
(0)退出(1)正方(2)立方(3)交换x和y的值: