`
eriol
  • 浏览: 401328 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

函数指针和指针函数

    博客分类:
  • C++
阅读更多

函数指针

 

在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。

 

 

1. 函数指针定义

 

函数类型 (*指针变量名) (形参列表);

    “函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

 

例如:

 

int (*f)(int x);

double (*ptr)(double x);
 

    在定义函数指针时请注意:

  • 函数指针和它指向的函数的参数个数和类型都应该是—致的;
  • 函数指针的类型和函数的返回值类型也必须是一致的。

 

2. 函数指针的赋值

 

函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。

例如:

 

int func(int x);   /* 声明一个函数 */

int (*f) (int x);   /* 声明一个函数指针 */

f=func;              /* 将func函数的首地址赋给指针f */

 

    赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

 

 

3. 通过函数指针调用函数

 

函数指针是通过函数名及有关参数进行调用的。

 

与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。

 

由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步:

  1. 说明函数指针变量。                      int (*f)(int x);
  2. 对函数指针变量赋值。                   f=func;
  3. 调用函数。                                  (*f)(x);

 

4. 使用typedef使得函数指针更直观更方便

 

typedef 返回类型(*新类型)(参数表)
 

    例如:

 

typedef char(*PTRFUN)(int);

PTRFUN pFun;
char glFun(int a) {return;}

void main()
{
    pFun = glFun;
    (*pFun)(2);
}

 

   typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。第二行的代码便使用这个新类型定义了变量pFun,此时就可以使用这个变量了。

 

 

 

指针函数

 

一个函数不仅可以带回一个整型数据的值,还可以返回指针类型的数据,使其指向某个地址单元。指针函数就是返回指针的函数。

 

返回指针的函数,一般定义格式为:

 

 类型标识符 *函数名(参数表)

 

例如:

 

int *f(x, y);
 

其中x,y是形式参数,f是函数名,调用后返回一个指向整型数据的地址指针。f(x,y)是函数,其返回值是指针。

 

 

总结:

 

函数指针是一个指向函数的指针,而指针函数只是说明它是一个返回值为指针的函数。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics