C++:函数指针基础全面解析

[来源] 达内    [编辑] 达内   [时间]2012-09-11

函数名可以理解为该类型函数的指针。当然,取地址操作符作用于函数名上也能产生指向该类型函数的指针。也就是说下面两种赋值都是可行的。

这篇是为了加深记忆所写。发现,很多知识若不经过反复的琢磨和动手实践,是很难记得住的。

  ①函数指针的初始化。函数如下:

< div id="div_code" style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 97%; padding-right: 5.4pt; background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px">
1 int CompareString(const string & str1, const string& str2)
2 {
3     return str1.compare(str2);  
4 }

   函数的初始化有两种方式:

  第一种,也是最普遍的方式:

< div id="div_code" style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 97%; padding-right: 5.4pt; background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px">
int (*CompareFunction)(const string &, const string&) = CompareString;

   第二种,是使用typedef定义函数类型,这种写法有助于对代码的理解:

< div id="div_code" style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 97%; padding-right: 5.4pt; background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px">
typedef int (*CompareFunctionType)(const string&, const string& );
CompareFunctionType CompareFunction
= CompareString;

   ② 函数指针赋值。

  函数名可以理解为该类型函数的指针。当然,取地址操作符作用于函数名上也能产生指向该类型函数的指针。也就是说下面两种赋值都是可行的:

< div id="div_code" style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 97%; padding-right: 5.4pt; background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px">
CompareFunctionType CompareFunction = CompareString;
CompareFunctionType CompareFunction
= &CompareString;

  ③函数调用。

  无论是用函数名调用,还是用函数指针调用,还是用显式的指针符号调用,其写法是一样的:

< div id="div_code" style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 97%; padding-right: 5.4pt; background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px">
CompareString("abc", "cba ");
CompareFunction(
"abc", "cba ");
(
*CompareFunction)("abc", "cba");

   ④ 函数指针的数组。

  对于函数指针的数组,强烈建议使用typedef方式定义类型之后再使用,不然影响代码的阅读性,继续以以上例子为例:

< div id="div_code" style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 97%; padding-right: 5.4pt; background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px">
//without typedef
int (*CompareFunctionArray[3])(const string&, const string &);
 //with typedef
CompareFunctionType CompareFunctionTypeArray[3];

资源下载