函数指针返回指向函数的指针 指向函数的指针

准确地讲,本文所涉及的内容是C++中较难理解的,本文的目的不是在于将它们解释清楚,因为这需要你循序渐进地做很多练习才可以。看下面一个例子:
int (*func(bool real))(int, int) 

你觉得它的返回值是什么?

这里就涉及到了如何理解指向函数的指针的问题了。一些来自C++教材的建议是从里向外解读这个表达式,这里所谓的里面就是func(boolreal),那么剩下的部分就是所谓的返回值了?有点生硬吧。下面就让我们循序渐进地看看如何理解更好?

为什么会对这个表达式的返回值产生疑问?

要解决问题通常需要找出问题所在,这里是基于这样一种思维定势,那就是我们通常习惯于这样一种声明变量的方式:

int a;

这里我们声明a是一个int类型的变量。而对于返回值,我们通常也是采用类似的方式,如一个返回值为int类型的函数通常可以以下面的方式进行声明:

intfunc([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类型值的函数一样,因此使用以下方式即可:

PFfunc([params]);

现在让我们扩展PF,将它还原,也就是把右侧的func([params])部分移到那个横线的位置上。现在我们就可以很轻松地理解本文开头的那个函数,原来是返回值为int(*)(int, int)的函数

int (*func(bool real))(int, int) 

以上划线的部分也就是一个函数扣除返回值的部分。也就等价于

PF func(bool real) 

至此你应该能够分析更加复杂的表达式了。

下面的示例旨在帮助理解本文:

#include<stdlib.h>
#include <iostream>
using std::cout;
using std::endl;

int myCompare1(
int a, int b,
int (*Compare)(int, int));
int realCompare(int a, int b);
int fakeCompare(int a, int b);

typedef int (*PF)(int,int);

int myCompare2(
int a, int b,
PF Compare);

PF getAPointerFunc1(boolreal);

int (*getAPointerFunc2(boolreal))(int, int);

int main(void)
{
int typeDeclared;
typeDeclared = 1;

//PF pCompare;
int(*pCompare)(int, int);//定义了一个函数指针

if(pCompare == NULL)
cout<<"pCompare== NULL"<<endl;
else
{
cout<<"pCompare!= NULL"<<" pComapre ="<<pCompare<<endl;
}

cout<<"Compare thepointer function."<<endl;
cout<<"The compareresult is : "<<
myCompare1(6, 5,realCompare)<<endl;//函数名实质是一个指针常量,指向函数的常指针,realCompare传递给Compare
//此时,return Compare(a, b)=return realCompare(a, b);

cout<<"It's thesame to invoke realCompare & *realCompare :"<<
myCompare1(6, 5,*realCompare)<<endl;

cout<<"Using thetypedef to predigest definition :"<<
myCompare2(8, 7,realCompare)<<endl;

cout<<"Return apointer from a function : "<<
myCompare2(10, 20,getAPointerFunc1(true))<<endl;//通过函数调用,返回函数名,及常函数指针

cout<<"Return apointer from a function : "<<
myCompare2(20, 30,getAPointerFunc2(false))<<endl;

return EXIT_SUCCESS;
}

int myCompare1(
int a, int b,
int (*Compare)(int, int)){
return Compare(a, b);
}


int realCompare(int a, int b){
cout<<"TherealCompare has beinvoked."<<endl;
if(a == b)
return 0;
if(a < b)
return -1;
else
return 1;
}

int fakeCompare(int a, intb){
cout<<"ThefackCompare has beinvoked."<<endl;
return 200;
}

int myCompare2(
int a, int b,
函数指针返回指向函数的指针 指向函数的指针
PF Compare){
return Compare(a, b);
}

PF getAPointerFunc1(boolreal){
if(real)
return realCompare;
else return fakeCompare;
}

int (*getAPointerFunc2(boolreal))(int, int){
if(real)
return realCompare;
else return fakeCompare;
}

  

爱华网本文地址 » http://www.413yy.cn/a/25101010/32991.html

更多阅读

函数指针返回指向函数的指针 指向函数的指针

准确地讲,本文所涉及的内容是C++中较难理解的,本文的目的不是在于将它们解释清楚,因为这需要你循序渐进地做很多练习才可以。看下面一个例子:int (*func(bool real))(int, int) 你觉得它的返回值是什么?这里就涉及到了如何理解指向函数

matlab中的最大值和最小值_待_雪 函数最大值和最小值

matlab中的的最大值和最小值MATLAB提供的求数据序列的最大值和最小值的函数分别为max和min,两个函数的调用格式和操作过程类似。1.求向量的最大值和最小值求一个向量X的最大值的函数有两种调用格式,分别是:(1) y=max(X):返回向量X的最

ROW函数的用途 excel中的row函数

ROW函数为返回引用单元格的行号或单元格区域。语法:ROW(reference),举个例子:=row(a15),返回值为15;=row(),返回值为公式所在单元格的行号;还可以引用数组。 =row(a1) 返回a1的行号,=1 =row(1:1) 返回第一行的行号,=1 =row(a:a) 返

求日期的月份函数MONTH getmonth 月份个位补0

  函数名称:MONTH  主要功能:求出指定日期或引用单元格中的日期的月份。  使用格式:MONTH(serial_number)  参数说明:serial_number代表指定的日期或引用的单元格。  应用举例:输入公式:=MONTH("2003-12-18"),确认后,显示出11。 

Vlookup、Lookup都靠边,Mlookup函数来了!! vlookup range lookup

Vlookup是最常用到的查找函数,但它有很大的局限性。比如:只能查找第一个符合条件的值,无法任意位置查找和多条件查找等。于是,兰色用VBA编写了一个功能强大的Mlookup函数。一、用法介绍=Mlookup(查找内容,查找区域,返回值所在的列数,第N

声明:《函数指针返回指向函数的指针 指向函数的指针》为网友鲜血当酱料分享!如侵犯到您的合法权益请联系我们删除