7.3.4 函数指针数组

    指向函数的指针还可以组成指针数组,称为函数指针数组。函数指针数组的使用范例见代码7.11。

    代码7.11 函数指针数组ArrayofFuncPointers


    <————————————-文件名:example711.cpp——————————————-> 01 #include<iostream> 02 typedef void(*hs)(int); 03 using namespace std; 04 void Sub_Print(int i)//Sub_Print()函数定义,输出参数减1 05 { 06 cout<<(i-1)<<""; 07 } 08 void Add_Print(int i)//Add_Print()函数定义,输出参数加1 09 { 10 cout<<(i+1)<<""; 11 } 12 void Just_Print(int i)//Just_Print()函数定义,输出参数,不加不减 13 { 14 cout<<i<<""; 15 } 16 void Call(const char*name,hs func)//Call函数定义,hs型函数指针func作为参数 17 { 18 int array[9]={1,2,3,4,5,6,7,8,9}; 19 cout<<name<<endl; 20 for(int i=0;i<9;i++) 21 func(array[i]);//对func()函数调用 22 } 23 int main() 24 { 25 char*names[]={"输出","减1输出","加1输出"};//创建一字符串数组 26 hs fun_sz[]={Just_Print,Sub_Print,Add_Print};//创建函数指针数组fun_sz 27 for(int i=0;i<3;i++) 28 { 29 Call(names[i],fun_sz[i]);//将函数指针数组中的元素传递给Call()函数 30 cout<<endl; 31 } 32 return 0; 33 }

    输出结果如下所示。


    输出 1 2 3 4 5 6 7 8 9 减1输出 0 1 2 3 4 5 6 7 8 加1输出 2 3 4 5 6 7 8 9 10

    【代码解析】该代码是对代码7.10的扩展,Sub_Print、Add_Print和Just_Print同是“一个int型参数,无返回值的函数”,语句“hs fun_sz[]={Just_Print,Sub_Print,Add_Print};”声明了大小为3的hs型一维函数指针数组fun_sz,并用已经定义的3个函数(函数名等价于指向函数的常指针)为数组元素初始化。通过数组合理组织函数,使程序结构条理清晰,可读性强。

    和普通数组一样,声明多维形式的函数指针数组也十分方便,此处不再赘述。

    函数指针数组中的每个元素必须是同类型的指针,即每个元素指向的函数必须具有相同的返回值和参数列表,如果是不同类型的函数指针,可以考虑使用链表。

    注意

    函数指针和普通指针本质是相同的,都指向内存中特定的程序实体。和普通指针一样,函数指针同样可以作为结构和类的成员(类的相关内容请参考第8章)。