函数指针

来源:互联网 发布:js模拟get请求 编辑:程序博客网 时间:2024/05/22 17:39

数组名就是指向数组第一个元素的常量指针

函数名也是指向函数第一条指令的常量指针

正常情况下,程序在编译后,每个函数都有一个首地址,也就是函数第一条指令的地址

我们用一个指针来保存这个地址,这个指针就是函数指针,该指针可看做是函数名,因此我们可以通过该指针调用函数


//函数指针使用实例的程序代码如下:
#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;
}



原创粉丝点击