数组名就是指向数组第一个元素的常量指针
函数名也是指向函数第一条指令的常量指针
正常情况下,程序在编译后,每个函数都有一个首地址,也就是函数第一条指令的地址
我们用一个指针来保存这个地址,这个指针就是函数指针,该指针可看做是函数名,因此我们可以通过该指针调用函数
//函数指针使用实例的程序代码如下:
#include <iostream>
#include <string>
using namespace std;
bool check(string str) //检测是否是数字的函数,要注意该函数一定要放在调用函数的上面
{
for(int i = 0;i<str.length();i++)
if((str[i]>'9' || str[i]<'0')&&(str[i]!='.'))
return false;
return true;
}
float triangle(float &x,float &y)
{
return x*y*0.5;
}
float rectangle(float &x,float &y)
{
return x*y;
}
void Swap(float &x,float &y)
{
float n;
n=x;
x=y;
y=n;
}
void print(float &x,float &y)
{
cout<<"长为:"<<x<<" "<<"宽为:"<<y<<endl;
}
void get(float &a ,float &b)
{
cout<<"请输入x的新值:";
string str1;cin>>str1;
while(!check(str1)) //调用检测数字函数,如果返回值为假,执行该循环,为真退出
{
cout<<"输入的不是数字,请重新输入!!!"<<endl;
cin>>str1;
}
a = atof(str1.c_str()); //将字符串转换为浮点数
cout<<"请输入y的新值:";
string str2;cin>>str2;
while(!check(str2)){
cout<<"输入的不是数字,请重新输入!!!"<<endl;
cin>>str2;
}
b = atof(str2.c_str());
}
int main()
{
void(*p)(float &,float &); //声明一个函数指针p,该指针指向一个返回void值并且带有两个float参数的函数
float(*fp)(float &, float &); //声明一个函数指针fp,该指针指向一个返回float值并且带有两个float参数的函数
bool quit=false;
float a=2,b=3; //定义两个参数a和b的值
int choice; //声明选择参数choice
while(quit==false)
{
cout<<"(0)退出(1)设定长宽(2)三角形(3)矩形(4)交换长宽:";
cin>>choice;
switch(choice) //条件判断语句
{
case 1:
p=get; //用指针p来指向函数名get,该函数带有两个float参数并返回一个void值,与函数指针p的参数和类型相吻合
break;
case 2:
fp=triangle; //用指针fp来指向函数名triangle,该函数带有两个float参数并返回一个float值,与函数指针fp的参数和类型相吻合
break;
case 3:
fp=rectangle; //用指针fp来指向函数名rectangle,该函数带有两个float参数并返回一个float值,与函数指针fp的参数和类型相吻合
break;
case 4:
p=Swap; //用指针p来指向函数名swap,该函数带有两个float参数并返回一个void值,与函数指针p的参数和类型相吻合
break;
default:
quit=true;
break;
}
if(quit)break;
if(choice==1||choice==4) //假如选择了第1或者第4项
{
print(a,b);
p(a,b); //调用函数指针p所指向的函数,该指针指向的是一个返回值为void的函数,由于不同的选项中将不同的函数名赋给了指针p,因此选择不同则调用的函数也不同
print(a,b);
}
else if(choice==2||choice==3) //假如选择了第2和第3项
{
print(a,b);
cout<<"面积为:"<<fp(a,b)<<endl; //调用函数指针fp所指向的函数,该指针指向的是一个返回值为float的函数,由于不同的选项中将不同的函数名赋给了指针fp,因此选择不同则调用的函数也不同
}
}
return 0;
}