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;
    }
    
  • 相关阅读:
    高级前端工程师面试必备(持续更新中)
    用node编写cli工具
    用vscode开发vue应用
    jsbridge的js封装
    react-create-app 构建react项目的流程以及需要注意的地方
    【面试篇】寒冬求职季之你必须要懂的原生JS(中)
    基于vue-cli3.0构建功能完善的移动端架子,主要功能包括
    @vue/cl构建得项目下,postcss.config.js配置,将px转化成rem
    eslint prettier editrorconfig
    数据结构题集--集锦
  • 原文地址:https://www.cnblogs.com/laohan1221/p/6240815.html
Copyright © 2011-2022 走看看