posts - 0, comments - 1, trackbacks - 0, articles - 5
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

         刚才在Driver novice群里面聊天,有个朋友问起了关于复杂函数指针的理解的问题,群里讨论的比较火热,现将起总结如下,也是本人第一次这么详细的分析一个函数指针的过程,算是留个纪念吧~
 1 想彻底的弄明白 int (*(*(*func)(int*))[5])(int**)这个式子,就要用Bruce Eckel大牛讲的“右左法则”,一左一右的分析一次,称为一步。
 2 先看func知道,这个是个自定义的变量名字 

 5 第一步 :
 6 向右看,看到 ),再向左看,看到*,表示这个是个xx类型的指针变量

 8 第二步:
 9 再向右看,看到(int *),现在我们看到的整体的式子是 (*func)(int*),说明它是一个函数指针,参数是个整型的指针
10 然后再向左看,看到 *,现在我们看到的整体的式子是 *(*func)(int*),说明他是个指向函数指针的指针,即这个函数指针的返回值是个指针类型

13 第三步:
14 再向右看,看到),再向左看,看到(,到这里,我们看到的完整的式子是这样的:(*(*func)(int*)),意义跟上面的*(*func)(int*)一样

16 第四步:
17 继续向右看,看到[5],现在我们看到的式子是(*(*func)(int*))[5],说明这个函数指针的返回值是个含有5个元素的数组的指针数组
18 再向左看,看到*
19 
20 第五步:
21 再向右看看到),再向左看,看到(,到这里,我们的完整的式子是:(*(*(*func)(int*))[5]),说明这个函数的返回值是个指向含有5个元素的指针数组的指针
22 
23 第六步:
24 再向右看,看到(int**),再向左看,看到int ,这时我们看到的就是这个完整的式子了int (*(*(*func)(int*))[5])(int**)
25 
26 到这里,如果我直接解释这个式子,可能会把你说糊涂,我们用等价替代的方法说明!
27 
28 先看我们的第二步得到的那个式子,(*func)(int*),这个是个函数指针,而*func,就是单纯的指针变量,
29 放到这个整个int (*(*(*func)(int*))[5])(int**)式子里也一样
30 
31 在第五步的时候,我们分析过了 *(*(*func)(int*))[5] 就是一个 “指针”,这样我们就做如下的转换;
32 
33 #define    *(*(*func)(int*))[5]   PFUNC    //    这个式子有语法错误,只是方便理解
34 
35 这样,我们的式子就可以被替换成这个样子:int (PFUNC)(int**),,这个很好理解的吧,他是一个函数指针,参数是指向int型指针的指针,返回一个int
36 
37 经上所数,得结论如下:
38 
39 int (*(*(*func)(int*))[5])(int**)
40       这是个指向含有5个元素的指针数组的指针的函数指针,它的参数是一个指向整型指针的指针变量,并返回一个int

         这个是典型的函数指针嵌套,int (*(*(*func)(int*))[5])(int**) 它本身就是一个函数指针,名字是*(*(*func)(int*))[5] 的返回值,参数是(int**) ,另一个是 (*func)(int*),这个很容易理解的!