谢谢了,原来就是和定义数据指针一样的说! 再多问一句,我们平时写代码的时候会用到 这么复杂的二重函数指针么?
有时候,如果需要一次性执行很多函数,但是 你又不知道这些函数的确切名字,或者不想让 这些函数的调用明显的出现在你的代码里面, 就可以用通过二重函数指针的方式来调用。 比较有名的例子,是在 linux 内核做初始化 的时候,它用二重函数指针来依次执行了很 多函数。在 .../init/main.c 文件中可以看 到下面这段代码:extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[];
static void __init do_initcalls(void) { initcall_t *call; for (call = __early_initcall_end; call < __initcall_end; call++) do_one_initcall(*call); /* Make sure there is no pending stuff from the initcall sequence */ flush_scheduled_work(); } 其中 initcall_t 是初始化函数指针的类型。 所有需要调用的初始化函数连续的存储在内存 里面,相当于构成了下面这样的一张表: __________ <-- __initcall_start __________ __________ __________ <-- __early_initcall_end __________ __________ __________ __________ __________ <-- __initcall_end 而__initcall_start,__early_initcall_end,和 __initcall_end 是链接器通过链接脚本设置好的 三个位置指针,也就是我们说的二重函数指针。 这三个二重指针将表分成了两段。 上面函数中的循环,即是从 __early_initcall_end 开始,到 __initcall_end 结束,依次调用表 里面存储的每个函数(也就是 *call).
我感觉c语言的这种功能多少有点华而不实。 刚周围有人说从来不会去用来的。
Learning, Just As Your Favourite Thing! Maillist, See http://www.juliantec.info/mlist/mail-lists.html JulBlog, See http://www.juliantec.info/julblog/summary.php JulWiki, See http://www.juliantec.info/wiki/