函数指针的使用

本文深入讲解函数指针的概念、声明及使用方式,并通过具体示例展示了如何利用typedef简化函数指针的代码,使得函数指针的使用更加简洁高效。

关于函数指针的使用

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;
}

转载于:https://www.cnblogs.com/laohan1221/p/6240815.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值