函数指针的使用

关于函数指针的使用

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