博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数的指针
阅读量:5999 次
发布时间:2019-06-20

本文共 2931 字,大约阅读时间需要 9 分钟。

hot3.png

定义

 

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

 

    bool (*pFunc)(intdouble);    

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

 

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

 

    总结,函数指针声明的一搬形式:

    T (*pFunc)(T args);

    pFunc为函数指针,T为数据类型,参数(T args)可以有多个,也可以没有。

 

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

    结果

0

 

 

typedef简化声明

 

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

    typedef bool (*FuncPointer)(intdouble);

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

    【例2】:

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

这样,如果有多个地方使用同种类型的函数指针的话,定义指向函数的指针就会简单很多。

 

用typedef定义函数指针的一般形式如下:

 

typedef  T (*FuncPtrType)(T args);

FuncPtrType pFunc = NULL;

 

FuncPtrType为这一函数指针类型的别名,T为数据类型,参数(T args)可以有多个,也可以没有;pFunc为函数指针。

初始化和赋值

    在【例1】和【例2】中已经提到了函数指针的使用。在给函数指针赋值时,直接引用函数名等效于在函数名上应用取地址操作符,都是把函数的地址赋给函数指针变量。

bool IsAdult(int age, double weight){	if (age > 18 || weight > 40.0)	{		return true;	}	return false;}bool isIntBiger(int val1, double val2){	return val1 > val2;}int GetMax(int val1, int val2){	return val1 > val2 ? val1 : val2;}typedef bool (*FuncPointer)(int, double);void TestFuncPointer(){	FuncPointer pf1 = 0;			// 初始化为0(即空指针),表示该指针不指向任何函数	FuncPointer pf2 = IsAdult;		// 用函数名初始化函数指针	FuncPointer pf3 = isIntBiger;	// IsAdult和isIntBiger参数和返回类型都相同,所以属于相同类型的函数	pf1 = IsAdult;					// 用函数名赋值	pf1 = pf3;						// 用函数指针赋值	cout << pf1(13, 15) << endl;	cout << pf2(13, 56) << endl;	cout << pf3(18, 15) << endl;	//FuncPointer pf4 = GetMax;		// error,GetMax不是属于FuncPointer类型的函数,因为参数类型和返回值的类型都不同	}

    结果:

0

1

1

 

函数指针作为函数参数

 

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

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

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

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

 

【例3】:

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

  

转载于:https://my.oschina.net/verynix/blog/365918

你可能感兴趣的文章
zend studio 9 字体,颜色,快捷键等相关设置
查看>>
我的友情链接
查看>>
基于用户投票的排名算法(二):Reddit
查看>>
下午最后的草坪
查看>>
我们是经过长时间亲测后的结果
查看>>
Android运行时配置更改
查看>>
一缕清风
查看>>
ECChop出现Strict Standards: Redefining already defined constructor错误
查看>>
Maven学习总结(七)——eclipse中使用Maven创建Web项目
查看>>
大型网站技术架构(一)大型网站架构演化
查看>>
我的Git忽略文件
查看>>
oracle rman 丢失controlfile spfile 恢复
查看>>
工具集
查看>>
互不侵犯King
查看>>
自建yum仓库并安装软件包
查看>>
docker使用总结
查看>>
HTML设计网页中的字体的问题
查看>>
Kafka及场景应用(中1)
查看>>
我还是图样啊
查看>>
用PHP读取和编写XML DOM4
查看>>