指向函数的指针(的数组)实例总结
指向函数的指针(的数组)实例总结
前言
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> </code></code></code></code></code></code></code></code></code></code></code>