7.3 函数与指针
在前面的章节中已经介绍了函数的传指针参数调用,返回指针,根据数组名和指针的等价性,函数的参数也可以是数组,在这些基本概念的基础上,本节讨论指向函数的指针以及带参主函数的相关内容。
7.3.1 指向函数的指针
函数是一组代码的封装体,这组代码在内存中占有一片存储空间,该空间的起始地址存放在以函数名为名的单元中,换言之,函数名就是指向函数的常指针,这有点类似于数组名是指向数组内存空间的常指针。
1.函数指针的声明和初始化
可以声明一个指针变量指向一个函数,称为指向函数的指针(简称“函数指针”),形式如下所示。
返回类型(*指针名)(参数列表);这样,便可用该指针间接调用函数,如下所示。 int(Compare)(const char,const char*);上述代码声明了一个名为Compare的函数指针,用以保存某些函数的地址,例如,可使用Compare指向C++标准函数库中的C风格字符串比较函数strcmp。 Compare=&strcmp; Compare=strcmp;
两种对Compare赋值(初始化)的方式都是正确的,函数名strcmp就可以看做指向函数的常指针。
此外,还可以在函数指针声明的同时对其初始化,如下所示。
int(Compare)(const char,const char*)=strcmp;
和普通指针变量一样,使用函数指针前,一定要对该指针进行初始化,使它指向某一可执行的函数块。给函数指针初始化或赋值时,指针和被指向的函数需要匹配函数参数的个数、类型及函数的返回值。
注意
“int(Compare)(const char,const char);”和“intCompare(const char,const char);”有何不同?前者声明了一个函数指针,后者是函数原型声明,返回值是int型指针。
2.函数指针使用举例
函数指针的使用范例如代码7.8所示。
代码7.8 函数指针的使用PointerToFunction
<———————————-文件名:example708.cpp———————————————-> 01 #include<iostream> 02 #include<cstring>//strcmp用到的头文件 03 using namespace std; 04 int main() 05 { 06 char sz1[]="hello,C++";//C风格字符串 07 char sz2[]="hello";//C风格字符串 08 int(pF)(const char,const char*);//函数指针的声明 09 pF=strcmp;//也可写作pF=&strcmp; 10 int result=pF(sz1,sz2);//也可写作int result=(*pF)(sz1,sz2); 11 if(result==0) 12 cout<<"字符串相等"<<endl; 13 else 14 cout<<"字符串不等"<<endl; 15 return 0; 16 }
输出结果如下所示。
字符串不等
【代码解析】从代码第8~10行,可以看出,使用函数指针调用函数有以下3个步骤。
❑声明函数指针;
❑对函数指针赋值(初始化);
❑用指针形式调用函数,调用格式如下所示。
指针名(参数表);//或者是(*指针名)(参数表)
注意
函数指针变量不支持算术运算,对函数指针的加减操作是没有意义的。