Time slip through our fingers!

三千山

    路漫漫其修远兮,吾将上下而求索

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

要定义一个指针指向一个无参数无返回值得函数,可以写成:

                     void (*funcptr)();

当看到像这样的一个复杂定义时,最好的处理方法是从中间开始向外扩展。“从中间开始”的意思是从变量名开始,这里是指funcptr。“向外扩展”的意思是先注意右边最近的项(在这个例子中没有该项,以括号结束),然后注意左边(用星号表示的指针),注意右边(空参数表表示这个函数没带任何参数),在注意左边(void指示函数没有返回值)。大多数声明都是以右-左-右动作的方式工作的。

回过头来看,“中间开始”(“funcptr是一个……”),向右边走(没有东西,被右括号拦住了),向左边走发现一个‘*’(…指针指向一个…”),向右边走并发现一个空参数表(“…没有带参数的函数…”),向左边走发现一个void(“funcptr是一个指针,它指向一个不带参数并返回void的函数”)。

可能有人对*funcptr需要括号感到奇怪。如果不适用阔汗,编译器会看到

                    void *funcptr();

这可能是在声明一个函数(返回一个void*)而不定义一个变量。了解了一个声明和定义应该是什么的时候,可以想象编译器要经历同样的过程。所以要“遇到”这些括号,使得编译器编译器会返回左边并发现’*’,而不是一直向右边发现一个空参数表。

posted on 2015-04-09 11:00  xueye9  阅读(406)  评论(0编辑  收藏  举报
@Baldwin