分类: C/C++
2007-05-13 16:49:58
上课的时候,老师说,有一年,微软出了一道题给来面试的程序员:
问 int(*P)()是什么?
那时侯我想了半天,也没弄明白。。。。最近终于有些懂了。
首先讨论函数的地址吧
eg1,用不同的方式调用函数
#include
using namespace std;
void simple()
{cout << "it's a simple program.\n";}
void main()
{
cout << "Call function...\n";
simple(); //名方式调用
(& simple)(); //地址方式调用
(&* simple)(); //间址调用
cout << "Address of function:\n";
cout< cout <<&simple << endl; cout << *&simple< } 运行结果自己运行吧。。。。 从上面的例子看出 1。函数名,函数地址都是函数的入口地址。对于 simple & simple &* simple 看起来不同,但是都是函数simple的代码模块在内存的入口地址值,称为函数地址。这点和数据对象是不同的。对于一个已经定义函数的函数,函数名,函数地址(指针),函数 指针所指对象都是同一样东西,表示函数入口地址。 2。函数调用指令要做的事是:找到函数入口地址,并传递参数。 现在知道函数的地址了,可以讨论函数指针了。 函数定义后,函数名表示函数代码在内存的直接地址。我门可以用一个指针变量获取函数的地址,通过指正变量的间址方式调用 函数。指向函数的指针变量就是函数指针了。 1,函数的类型 为了定义函数的指针,首先要明确什么是函数的类型。函数的类型是指函数的接口,注意,不是函数返回值的类型!,接口包括函数的参数定义和返回类型。 eg: double max(double,double); double min(double,double); double average(double,double); 这些函数的类型接口为:double(double,double) 所以,可以用关键字typedef定义函数类型名; typedef double functionType(double,double); 函数类型名定义了一类接口相同的函数的抽象。 函数类型定义的一般形式为 typedef 类型 函数类型(形式参数表); 函数类型是用户定义的类型名标识符。 2最重要的部分了:函数指针 要定义指向某一类函数的指针变量,可以用以下声名语句; 类型 (*指针变量名)(形参表); 函数类型 * 指针变量名; 对于上述已经定义的functionType,如果要定义指向这一类函数的指针变量,可以用申明语句 double (*fp)(double,double); functionType *fp; 有了函数类型定义, 便于同时定义多个类型 相同的函数指针: functionType *fp1,*fp2; 还可以用关键字typedef定义指针类型 typedef 类型(*指针类型)(形式参数表); typedef 函数类型 *指针类型; eg: typedef double(*pType)(double,double); pType pf1,pf2; 定义了两个pType类型的指针变量pf1和pf2 pf1 = max; //pf1指向函数max pf2 = min; //pf2指向函数min 3。用函数指针调用函数 一个已经定义的函数指针,赋给函数地址后可以调用函数。其一般形式为: (*指针变量名)(实参) 指针变量 名 (实参) eg: 向fp 赋予不同的函数地址,通过fp调用不同函数: fp = max ; x= fp(0.5,3.92); fp = min; x=fp(0.5,3.92); fp=vaerage; x= fp(0.5,3.92); 从函数调用性质可知, (*fp)(0.5,3.92)与fp(0.5,3.92)是等价的调用方式。 但(&fp)(0。5,3。92)是错误的。 因为fp是指针变量,他的地址不是函数地址,他的值才是函数地址