函数指针
由前面章节的学习可知,定义一个函数,函数代码会存储在代码区一块内存空间中,由函数名记录这块内存空间的起始地址。既然函数存储空间有地址编号,那么就可以定义一个指针指向存放函数代码的存储空间,这样的指针叫做函数指针。
函数指针的定义格式如下:
返回值类型 (*变量名)(参数列表)
在上述格式中,返回值类型表示指针指向的函数的返回值类型,“”表示这是一个指针变量,参数列表表示该指针所指函数的参数列表。需要注意的是,由于优先级的关系,“变量名”要用圆括号括起来。
假设定义一个参数列表为两个int类型变量,返回值类型为int的函数指针,则其定义如下:
int (*p)(int,int); //定义一个函数指针变量p
上述代码定义了函数指针变量p,该指针变量只能指向返回值类型为int且有两个int类型参数的函数。在程序中,可以将函数的地址(即函数名)赋值给该指针变量,但要注意,函数指针的类型应与它所指向的函数原型相同,即函数必须有两个int类型的参数,且返回一个int类型的数据,假设有一个函数func(),其声明格式如下:
int func(int a,int b);
可以使用上面定义的函数指针指向该函数,即使用该函数的地址为函数指针赋值,赋值代码如下所示:
p=func;
由此也可以看出,函数名类似于数组名,也是一个指针。如果有函数声明如下:
int func1(char ch);
则p=func1的赋值是错误的,因为函数指针p与func1()函数参数类型不匹配。
函数指针的调用方式与函数名类似,将函数名替换为指针名即可。假设要调用指针p指向的函数,其形式如下:
p(3,5);
上述代码与func(3,5)的效果相同。需要注意是的,函数指针不能进行算术运算,如p+n、p++、--p等,这些运算是无意义的。