指向函数的指针(的数组)实例总结

jopen 8年前

指向函数的指针(的数组)实例总结

前言

C语言、C++、ObjectC中都有类似指向函数的指针(的数组)的概念,用起来还是很不错的。运用得当能起到事半功倍的效果。

百度百科中“指向函数的指针”的定义

函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。

指向函数的指针

根据前面看到在百科中对 指向函数的指针 的解释,我们能够知道这其实就是一个指针的概念,只不过这个指针并不是指向一个数据类型,而是指向一个函数的。

这里可以借鉴指向基本数据类型的只针对概念对此理解。 指向int类型的指针变量可以这样声明

int a;  int *p;

对上面声明的p指针可以这样初始化

*p = &a;

使用p指针的方法:

*p = 10;

上述代码就通过p指向的地址把变量a设置为10。

通过上面对指针int类型的指针的回顾,下面开始 指向函数的指针

设想有如下函数:

int process(const char *s, int value);

只是一个例子而已,不用管实现神马功能。 如果不用指向函数的指针,直接调用应该是下面这样子

int result = process("jileniao.net", 100);

如果换做指向函数的指针方法,则会看到如下的代码。

int(*p_func)(const char *s, int value);  p_func = process; 

实际调用时,将会是:

int result = (*p_func)("jileniao.net", 100);

记住 指向函数的指针 在使用时,原函数名就是在内存中所占的地址(相当于取地址符&)。

指向函数的指针的数组

本概念,结尾词落在数组上,说明无论前面是神马东西,最终这必然是一个数组,而数组中的每个元素就是上面所说的 指向函数的指针

知道了这个本质,用起来也就没有太大的问题了。

请看实例:

int process1(const char *s, int value);  int process2(const char *s, int value);  int process3(const char *s, int value);  int process4(const char *s, int value);  int process5(const char *s, int value);  int process6(const char *s, int value);  int process7(const char *s, int value);  int process8(const char *s, int value);  int process9(const char *s, int value);

如上,有若干同样参数,同样返回值的一系列函数,想要在某种情况下依次调用,不通过 指向函数的指针的数组 ,可以顺序写一遍就OK了。但若想做的更优雅一些, 指向函数的指针的数组 就可以派上用场了。

int (*p_funcions[9])(const char *s, int value);

上面就已经声明了一个数组长度为9的 指向函数的指针的数组 ,继续往下看是对其初始化。

p_funcions[0] = process1;  p_funcions[1] = process2;  p_funcions[2] = process3;  p_funcions[3] = process4;  p_funcions[4] = process5;  p_funcions[5] = process6;  p_funcions[6] = process7;  p_funcions[7] = process8;  p_funcions[8] = process9;

想要使用这个数组,则可以这样。

int results[9];  for (int i = 0; i < 9; ++i) {      results[i] = (*p_funcions[i])("jileniao.net", 100);  }

文末,欢迎留言提出意见。谢谢!

</div>

来自: http://jileniao.net/cplusplus-function-pointer.html

</code></code></code></code></code></code></code></code></code></code></code>