2.6 函数指针
函数指针是指向可执行代码段或调用可执行代码段的信息块的指针,而不是指向某种数据的指针。函数指针将函数当作普通数据那样存储和管理。函数指针有一种固定的形式,就是包含一个确定的返回值类型和若干个函数参数。声明一个函数指针看起来与声明一个函数非常类似,只是在函数名之前有一个表示指针的*,并且函数名和星号会用小括号括起来。例如在下面一段代码中,match被声明为一个函数指针,它接收两个void指针类型的参数,同时返回一个整型。
int (*match)(void *key1, void *key2);
以上函数声明的意思是,我们指定了一个接收两个void指针,返回一个整型,名为match的函数指针。例如:假设有一个match_int函数,它的两个void指针参数指向整型并回返1。考虑到之前的函数声明match,我们可以这样去赋值:
match = match_int;
要执行一个由函数指针所引用的函数,我只需要在正常调用普通函数的地方调用函数指针。例如:想要调用之前提到的函数指针match,我们执行下面的语句,假设x,y和retval都已经被声明为整型:
retval = match(&x, &y);
在本书中,函数指针的一个重要用途是将函数封装到数据结构中去。例如:在实现链式哈希表时(见第8章),这个哈希表数据结构就包含一个类似以上所提到的名为match的函数指针。此函数的作用是,当任何时候我们需要判断被查找的数是否在表中存在时,都可以调用此函数来完成查找。当哈希表初始化时,某个函数会被指派给这个指针。这个被指派的函数与match有相同的原型,不同之处是,在内部进行两个元素的比较时,函数会根据哈希表中的数据类型进行具体类型的数据比较。在特定的数据结构中声明一个函数是C语言一种非常好的特性,因为它可以使数据结构或函数变得更具通用性。
PS:
1、此书(Mastering Algorithms with C)译稿版权归本人(Love_Lei)及好友(bigship)共同所有,未经本人同意谢绝一切转载,并不得抄袭,模仿,盗版!更请大家监督盗版之人!
2、由于本人水平有限,如对译文有任何建议和异议,欢迎大家留言指正,我们共同讨论学习!谢谢!