Chinaunix首页 | 论坛 | 博客
  • 博客访问: 413435
  • 博文数量: 95
  • 博客积分: 5001
  • 博客等级: 大校
  • 技术积分: 1030
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-13 11:43
文章分类

全部博文(95)

文章存档

2007年(95)

我的朋友

分类: 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是指针变量,他的地址不是函数地址,他的值才是函数地址

阅读(699) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~