函数指针,返回指向函数的指针
来源:互联网 发布:淘宝保证金改版交5000 编辑:程序博客网 时间:2024/06/02 19:37
int (*func(bool real))(int, int)
你觉得它的返回值是什么?
这里就涉及到了如何理解指向函数的指针的问题了。一些来自C++教材的建议是从里向外解读这个表达式,这里所谓的里面就是func(bool real),那么剩下的部分就是所谓的返回值了?有点生硬吧。下面就让我们循序渐进地看看如何理解更好?
为什么会对这个表达式的返回值产生疑问?
要解决问题通常需要找出问题所在,这里是基于这样一种思维定势,那就是我们通常习惯于这样一种声明变量的方式:
int a;
这里我们声明a是一个int类型的变量。而对于返回值,我们通常也是采用类似的方式,如一个返回值为int类型的函数通常可以以下面的方式进行声明:
int func([params]);
因此我们惯性地认为返回值就是最左侧的一个类型名,虽然这通常是对的,但是针对上面的那个例子则显得十分尴尬。
让我们看看一个指向函数的指针的声明式:
int (*pCompare)(int, int);
这个指针的名字就是pCompare,令人奇怪的是pCompare并不是在整个声明式的最右边,类型也肯定不是int,而是一个复杂的表达式。让我们用typedef来声明就会发现typedef的使用也不太一样。
typedef int (*PF)(int, int);
我们发现跟惯用的typedef *** ???;的方式也截然不同,在上面这个typedef过后,整个表达式可以被简化成:
PF pCompare;
现在我们似乎就一见如故了,现在的表达式看起来中规中矩,普通的声明都是类型名加变量名完成声明,而函数指针的声明则是在一个表达式中一个固定的位置进行声明。
int (* )(int, int);
在上文中划线的部分即为声明的部分,也就是这点不同让我们逐渐迷失了方向。
现在让我们写一个返回指向函数的指针的函数,也就是返回值是PF的函数,这就像我们从返回int类型的变量到返回int类型值的函数一样,因此使用以下方式即可:
PF func([params]);
现在让我们扩展PF,将它还原,也就是把右侧的func([params])部分移到那个横线的位置上。现在我们就可以很轻松地理解本文开头的那个函数,原来是返回值为int (*)(int, int)的函数
int (*func(bool real))(int, int)
以上划线的部分也就是一个函数扣除返回值的部分。也就等价于
PF func(bool real)
至此你应该能够分析更加复杂的表达式了。
下面的示例旨在帮助理解本文:
#include <stdlib.h>
#include <iostream>
usingstd::cout;
using std::endl;
int myCompare1(
int a,intb,
int (*Compare)(int,int));
int realCompare(inta,intb);
int fakeCompare(inta,intb);
typedef int (*PF)(int,int);
int myCompare2(
int a,intb,
PF Compare);
PF getAPointerFunc1(bool real);
int (*getAPointerFunc2(boolreal))(int,int);
int main(void){
int typeDeclared;
typeDeclared = 1;
//PF pCompare;
if(pCompare==NULL)
cout<<"pCompare == NULL"<<endl;
else
{
cout<<"pCompare != NULL"<<"pComapre = "<<pCompare<<endl;
}
cout<<"Compare the pointer function."<<endl;
cout<<"The compare result is :"<<
myCompare1(6,5, realCompare)<<endl;
cout<<"It's the same to invoke realCompare & *realCompare :"<<
myCompare1(6,5,*realCompare)<<endl;
cout<<"Using the typedef to predigest definition :"<<
myCompare2(8,7, realCompare)<<endl;
cout<<"Return a pointer from a function :"<<
myCompare2(10,20, getAPointerFunc1(true))<<endl;
cout<<"Return a pointer from a function :"<<
myCompare2(20,30, getAPointerFunc2(false))<<endl;
return EXIT_SUCCESS;
}
int myCompare1(
int a,intb,
int (*Compare)(int,int)){
return Compare(a, b);
}
int realCompare(inta,intb){
cout<<"The realCompare has be invoked."<<endl;
if(a==b)
return 0;
if(a<b)
return -1;
else
return1;
}
int fakeCompare(inta,intb){
cout<<"The fackCompare has be invoked."<<endl;
return 200;
}
int myCompare2(
int a,intb,
PF Compare){
return Compare(a, b);
}
PF getAPointerFunc1(bool real){
if(real)
return realCompare;
else returnfakeCompare;
}
int (*getAPointerFunc2(boolreal))(int,int){
if(real)
return realCompare;
else returnfakeCompare;
}
#include<iostream>using namespace std;void hello(int a){ cout<<a<<endl;}void (*world)(int);int main(){ world=hello; world(50); return 0;}
#include<iostream>using namespace std;void f(int a){ cout<<a<<endl;}int main(){ typedef void (*p)(int a); p x; x=&f; x(5); return 0;}
- 函数指针,返回指向函数的指针
- 返回指向函数的指针
- 函数返回指向函数的指针
- 函数指针、函数返回指针、const指针、指向const指针,指向const的const指针。
- C++函数指针指向一个返回函数指针的函数
- 指向函数的指针和 返回指针的函数
- 指向函数的指针与返回指针值的函数
- 指向函数的指针和返回指针的函数
- 指向函数的指针 和 返回指针的函数
- 14返回指针的函数与指向函数的指针
- 指向函数的指针/返回指针的函数
- 【C++】指向函数的指针与返回指针的函数
- 返回指针的函数与指向函数的指针
- 返回指针的函数&&指向函数的指针
- 函数返回指向自己的指针
- C++中返回指向函数的指针
- VC:返回指向函数的指针
- C++ 返回指向数组指针的函数
- 《Axure 6.5超短篇笔记》——“部件的范围”条件一个部件旋转后和另一个部件相同
- C++异常类设计
- Javacript原型链
- oracle分析函数
- DM6446中 串口1 的移植方法
- 函数指针,返回指向函数的指针
- 《Axure 6.5超短篇笔记》——“部件的范围”条件一个形状旋转后和另一个形状旋转后相同
- hdu 2399
- 关于 grouping sets 学习
- 日本留学生独立能力的重要性
- 一个程序员的自我修养
- VIM插件
- Java字符串批量替换处理
- linux内存管理之三——slab分配器