函数指针

来源:互联网 发布:图书开卷数据 编辑:程序博客网 时间:2024/05/16 18:28

在程序运行中,全局变量存放在data区,局部变量放在栈区,动态变量放在堆区。函数代码是程序的
算法指令部分,同样也占用内存空间,存放在代码(code)区。

每个函数都有地址。指向函数地址的指针称为函数指针。

函数指针指向代码区中的某个函数,通过函数指针可以调用相应的函数。

1。定义函数指针:

 int (* func)(char a, char b);

 int 为函数的返回类型; *表示后面的func是一个指针变量名;
 后面的()表示该定义是函数或函数指针,这里是函数指针。
 该函数有两个字符型参数a和b。

 定义函数指针后就产生了指针变量,它有全局、静态和局部之分。占有内存空间。

2。函数指针的内在差别
 注意!!
 省略[]的数组名是地址,省略()的函数也是地址,所以可以将省略了()的函数名作为
 含数的地址赋给函数指针。(但是要注意参数、返回值的问题!)

 注意!!
 函数指针和其他数据类型的指针尽管都是地址,但类型有很大差别。他们之间不允许互相赋值!
 甚至,显式转换都不行!
 因为:函数指针指向程序的code区,是程序运行的指令代码,而数据指针指向data、stack和heap区,是
 程序赖以运行的各种数据。

3。通过函数指针来调用函数:
 首先必须给函数指针赋值!如:
 int fn3(int a);
 int (* fp2)(int s);
 fp2 = fn3;//ok,函数参数和返回值类型相一致,函数名赋给函数指针!

 然后:
  fp2(5);或者(* fp2)(5);

4。用typedef来简化指针:
 有时,经常要定义同一个函数指针,最好将该函数指针用别名声明下来:
  typedef int(* FUN)(int a, int b);   //声明FUN是一个函数指针类型
  FUN funp; //funp为一个返回整型和两个整形参数的函数指针
 注意!FUN是一个函数指针类型,该指针类型中的指针指向一个函数,它有两个整形参数,返回一个整数值。
 FUN不是指针变量,只是一个指针类型名。FUN funp;的函数指针定义,才确定一个函数指针变量funp。

5。函数指针构成指针数组:


#include <iostream.h>

typedef void (* MenuFun)();
void f1(){cout<<"good!/n";}
void f2(){cout<<"better!/n";}
void f3(){cout<<"best!/n";}

MenuFun fun[] = {f1, f2, f3};

void main()
{
 int choice;
 do{
  cout << "1--------display good /n"
    << "2--------display better /n"
    << "3--------display best /n"
    << "0--------exit /n"
    << "Enter your choice: ";
  cin>> choice;
  switch (choice)
   {
    case 1: fun[0]();
     break;
    case 2: fun[1]();
     break;
    case 3: fun[2]();
     break;
    case 0: return;
    default: cout<<"you entered a wrong key./n";
   }
  }while(choice);
}

6。函数的返回类型可以是函数指针:
 例如:
 typedef int (* SIG)();       //声明返回整型且无参数的函数指针类型SIG
 typedef void (* SIGARG)();   //声明无返回且无参数的函数指针类型
 SIG signal(int, SIGARG);     //定义返回函数指针的函数

SIG signal(int, SIGARG)定义一个函数,该函数返回一个函数指针,且有一个整形参数和一个函数指针参数。
它返回的函数指针是指向返回整型且无参数的函数