C++/C编程学习:梳理10---函数的指针

原文:https://blog.csdn.net/luoweifu/article/details/40709915

定义

    函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型(特定的函数类型)。函数类型由其返回类型以及形参表确定,而与函数名无关。如下声明了一个函数指针:

    bool (*pFunc)(int, double);    

    这个语句将pFunc声明为指向函数的指针,它所指向的函数带有两个类型分别为int和double的形参及一个 bool 类型的返回值。

    说明:*pFunc 两侧的圆括号是必需的,否则它就变成了函数的声明,如:bool *pFunc(int, double);表示pFunc是一个带有两个参数(int和double)和一个bool指针类型返回值的函数。

案例1:

bool IsAdult(int age, double weight)
{
	if (age > 18 || weight > 40.0)
	{
		return true;
	}
	return false;
}
 
void TestFuncPointer()
{
	bool (*pFunc)(int, double);
	pFunc = IsAdult;
	cout << pFunc(12, 23) << endl;
}

用typedef简化声明

    我们知道typedef可以给类型定义一个别名,函数指针本身就是一种类型,所以也可以给其定义一个别名简化基声明。如下:

    typedef bool (*FuncPointer)(int, double);

    该定义表示 FuncPointer是一种函数指针类型的名字。该指针类型为“指向返回 bool 类型并带有两个(int和double)引用形参的函数的指针”。则【例1】中的使用简化为如下:

bool IsAdult(int age, double weight)
{
	if (age > 18 || weight > 40.0)
	{
		return true;
	}
	return false;
}
 
typedef bool (*FuncPointer)(int, double);
 
void TestFuncPointer()
{
	FuncPointer pFunc = IsAdult;
	cout << pFunc(12, 23) << endl;
}

函数指针作为函数参数
 

    函数指针还可以作为别一个函数的形参。这种形参可以用以下三种形式中的任何一种编写:

void printBiger(int, int, int (int, int));    //等价于void printBiger(int, int, int func(int, int));

void printBiger(int, int, int(*func)(int, int));    //等价于void printBiger(int, int, int(*func)(int, int));

void printBiger(int, int, FuncPointerMax);    //还可以用简化的形式

int GetMax(int val1, int val2)
{
	return val1 > val2 ? val1 : val2;
}
 
typedef int (*FuncPointerMax)(int, int);
 
void printBiger(int val1, int val2, int func(int, int))
{
	cout << func(val1, val2) << endl;
}
 
void TestFuncPointer()
{
	FuncPointerMax pFuc = GetMax;
	printBiger(5, 10, pFuc);
}

函数指针作为函数的返回值


  函数指针还可以作为函数的返回值类型,其写法比较复杂,例如:

  int (*func(int))(int*, int);

要理解这个函数指针的声明,最佳的方法是从声明的名字开始由里而外理解。func(int) 将func声明为一个函数,它带有一个int型的形参,该函数返回一个函数指针,函数指针的类型为:

    int (*)(int*, int);

    是不很难理解?那有没有易于理解的写法呢?答案是肯定的,我们同样可以用typedef 进行简化,如下:

    typedef int (*FuncPointer)(int*, int);

    FuncPointer func(int);
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值