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个步骤。

    ❑声明函数指针;

    ❑对函数指针赋值(初始化);

    ❑用指针形式调用函数,调用格式如下所示。


    指针名(参数表);//或者是(*指针名)(参数表)

    注意

    函数指针变量不支持算术运算,对函数指针的加减操作是没有意义的。