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

2015年12月06日 其他资源 暂无评论 阅读1485次

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


前言

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);
}

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


分享本文至:

WRITTEN BY

avatar
本文标签:指针函数指针
看了本文是不是觉得很赞,那就赶紧点击下面按钮分享给身边的朋友吧!

欢迎留言




用户登录

sitemap