代码改变世界

读书笔记《征服C指针》----C的声明是这样解读的

2014-09-26 20:16  牧羽  阅读(285)  评论(0编辑  收藏  举报

      解读C的声明的最好方法是用英语来阅读,道理很简单,因为C语言是美国人发明的。

为了把问题变得更简单,在这里暂不考虑const和volatile。接下来遵循以下步骤来解释C的声明。

  1. 首先着眼于标识符(变量名或者函数名)。
  2. 从距离标识符最近的地方开始,依照优先顺序解释派生类型(指针、数组、和函数)。优先顺序说明如下:
    • 用于整理声明内容的括弧。
    • 用于表示数组的[],用于表示函数的()。
    • 用于表示指针的*。
  3. 解释完成完成派生类型,使用“of”、“to”、“returning”将它们连接起来。
  4. 最后,追加数据类型修饰符(在左边,int,double等)。
  5. 英语不好的人,可以倒序用中文解释。

数组元素个数和函数的参数属于类型的一部分。应该将它们作为附属类型的属性进行解释。

比如:int (* func_p)(double);

     1.首先着眼于标识符。  int (* func_p)(double);   英语的表达为 func_p is 

     2.因为存在括号,这里着眼于*。 int (* func_p)(double);  英语的表达为func_p is pointer to

     3.解释用于函数的(),参数是double。int (* func_p)(double);  

       英语的表达为:func_p is pointer to function(double) returnning

     4.最后解释数据类型修饰符int。int (* func_p)(double);

        英语的表达为:func_p is pointer to function(double) returnning int。

     5.最后翻译成中文:func_p是指向返回int的函数的指针。

根据这样的步骤,可以解释任何一个声明,比如更为复杂的:int atexit(void (*func)(void));
英语的表达为:atexit is function (func is pointer to function(void) returnning to void) returnning int.

翻译成中文为:atexit 是返回int的函数的(参数是,指向返回void没有参数的函数指针)