在程序运行中,全局变量存放在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)定义一个函数,该函数返回一个函数指针,且有一个整形参数和一个函数指针参数。
它返回的函数指针是指向返回整型且无参数的函数