• 函数指针的使用


    关于函数指针的使用

    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;
    }
    
  • 相关阅读:
    React在componentDidMount里面发送请求
    React 术语词汇表
    React里受控与非受控组件
    React和Vue等框架什么时候操作DOM
    【LeetCode】79. Word Search
    【LeetCode】91. Decode Ways
    【LeetCode】80. Remove Duplicates from Sorted Array II (2 solutions)
    【LeetCode】1. Two Sum
    【LeetCode】141. Linked List Cycle (2 solutions)
    【LeetCode】120. Triangle (3 solutions)
  • 原文地址:https://www.cnblogs.com/laohan1221/p/6240815.html
Copyright © 2020-2023  润新知