zoukankan      html  css  js  c++  java
  • 函数指针的使用

    关于函数指针的使用

    1. 函数指针的类型

      函数指针的类型由它的返回值和参数类型决定,与函数名无关。例如:

    bool lengthCompare(const string &,const string &);
    

      它的类型是bool(const string &,const string &),lengthCompare 则是指针名。

    2. 声明

      声明:bool(*pf)(const string &,const string &);注意此处()不可以省去,省去就变成了返回值是bool* 的pf函数。  
      当我们把函数名当一个值来使用的时候,该函数自动转化成指针:
      pf = lenthCompare或者pf = &lengthCompare都可以。

    3. 指针形参

      函数的形参可以是指向函数的指针,例如;
      

    //第三个参数是函数类型,它会自动转换成指向函数的指针
    void useBigger(const string &s1,const string &s2,bool pf(const string &,const string &));
    

      和下例:

    //等价的声明:显示的将形参定义成指向函数的指针
    void useBigger(const string &s1,const string &s2,bool (*pf)(const string &,const string &));
    

    4. 函数指针的使用

      直接使用函数指针类型显得冗长而繁琐,通常我们会使用typedef来简化函数指针的代码,例如:
      

    //注意:此时Func为函数类型;
    typedef bool Func(const string &,const string &);
    //此时Funcp是函数指针;
    typedef bool (*Funcp)(const string &,const string &);
    

    5.实际使用例子:

    • 未使用typedef时的代码:
    #include<iostream>
    using namespace std;
    
    struct DATA
    {
    
    };
    struct SNode
    {
    	DATA data;
    	SNode *pNext;
    };
    int byName(SNode *p1,SNode *p2)
    {
    	return 0;
    }
    int byNumb(SNode *p1,SNode *p2)
    {
    	return 0;
    }
    int byMath(SNode *p1,SNode *p2)
    {
    	return 0;
    }
    void Sort(int pfunc(SNode *p1,SNode *p2))
    {//此时在使用时参数就显得冗长。
    	SNode *pi,*pj;
    	pi = pj = 0;
    	int i = pfunc(pi,pj);
    	return;
    }
    void Browse()
    {
    	int i;
    	cin>>i;
    	switch (i)
    	{
    	case 1:
    		Sort(byName);
    		break;
    	case 2:
    		Sort(byNumb);
    		break;
    	case 3:
    		Sort(byMath);
    		break;
    
    	default:
    		break;
    	}
    }
    void main()
    {
    	Browse();
    	return;
    }
    

    而使用typedef对函数指针重命名之后,如下:

    #include<iostream>
    using namespace std;
    
    struct DATA
    {
    
    };
    struct SNode
    {
    	DATA data;
    	SNode *pNext;
    };
    typedef int (*pf)(SNode *p1,SNode *p2);//把函数指针的类型定义为pf,切记pf是一个类型名,而不是函数名;
    int byName(SNode *p1,SNode *p2)
    {
    	return 0;
    }
    int byNumb(SNode *p1,SNode *p2)
    {
    	return 0;
    }
    int byMath(SNode *p1,SNode *p2)
    {
    	return 0;
    }
    void Sort(pf pfunc)
    {//此时在使用时就显得很简洁美观了,pfunc所指向的内容是由Browse调用的时传进来的。
    	SNode *pi,*pj;
    	pi = pj = 0;
    	(*pfunc)(pi,pj);
    	return;
    }
    void Browse()
    {
    	int i;
    	cin>>i;
    	switch (i)
    	{
    	case 1:
    		Sort(byName);
    		break;
    	case 2:
    		Sort(byNumb);
    		break;
    	case 3:
    		Sort(byMath);
    		break;
    
    	default:
    		break;
    	}
    }
    void main()
    {
    	Browse();
    	return;
    }
    
  • 相关阅读:
    java实现第七届蓝桥杯阶乘位数
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯圆圈舞
    java实现第七届蓝桥杯打靶
    java实现第七届蓝桥杯打靶
    Mysql 查询一天中,每个小时数据的数量
    mysql 获取昨天日期、今天日期、明天日期以及前一个小时和后一个小时的时间
  • 原文地址:https://www.cnblogs.com/laohan1221/p/6240815.html
Copyright © 2011-2022 走看看