C函数指针剖析与应用
时间:2010-09-16 来源:biti-leaf
虽然,问题解决了,但是我的思考并没有结束。这里只有4个hash函数,如果有100个hash函数呢?难道我要在我的程序里判断100次吗?
if(type == 1) |
C语言的精髓在于指针,那函数指针或许可以。
记得我第一次看到函数指针时,那是在大二上的《数据结构》课上,当时,老师讲到遍历二叉树,我清楚的记得当时书上将打印二叉树节点的信息的函数是作为一个指针传递给遍历函数的。当时,我并不理解,而且,老师也说,这个你们不用深究,用处不大.....。
这个设计是非常合理的,便于代码的重用,因为我们不知道二叉树节点中的存了什么类型的信息,可能是int,可能是char,可能是string,更有可能是别的数据结构等等,这样,每当我们要遍历存储不同信息的二叉树时,只需要修改打印函数即可!!!
现在想想,真想对那个老师说,老师,你骗了我不是一次两次,而是四年!以后要是有可能教书,我一定教C语言。
这里,我写了一个简单的例子。
问题描述:写一个打印函数,能够打印不同类型的数组,如int、char等
解决方案:
1)我们首先要写出分别打印int和char数组内容的函数
void print1(void *a, int n) |
2)定义一个接口函数。
void print_array(void *p, int n, void (*print)(void *, int)) |
3)测试函数
int main() |
[root@localhost c]# vi func.c
[root@localhost c]# gcc func.c -o func
[root@localhost c]# ./func
number:1
number:2
number:3
number:4
number:5
char:a
char:b
char:c
char:d
char:e
注:其实我们可以利用typedef做个定义
typedef void(*p_print)(void *, int);
print_array函数就可以改成void print_array(void *p, int n, p_print print)
这样,无论我们到打印什么类型,只要将写好相关的打印函数,然后把函数作为参数传给print_array函数即可。
这里,或许有些人会说,那何必这么麻烦,我直接调用print1(a,5)和print2(b,5)不就行了,何必多此一举呢?遇到这种人,我只能对他说,真正编了几万行的C语言代码之后再跟我谈论这个问题吧。