27 Sep 2014
最近在看《C专家编程》, 结合《征服C指针》对上次的笔记做了一部分修改:
如何阅读C的声明? 用英语阅读 , 按照以下步骤:
1, 首先着眼于标识符(变量名或者函数名)
2, 从距离标识符最近的地方开始, 依照优先顺序解释派生类型(指针、数组和函数)。优先顺序如下:
2.1 用于整理声明内容的括弧 2.2 后缀操作符: 用于表示数组的[], 用于表示函数的() 2.3 用于表示指针的*
3, 解释完派生类型, 使用"of"、"to"、"returning"将他们连起来
4,最后, 追加数据类型修饰符(在左边, int, double等), 对于const关键字, 如果右边紧跟类型修饰符(如int, double等), 则它作用于类型修饰符, 否则作用于左边紧邻的 *
指针星号, 并且虽然const意思是常量, 把它解读为 read-only
才更加正确
5,英语不好的人, 可以倒序用中文解释
注意读完一部分就把那一部分换成()忽略掉。
比如:
int (*func_p)(double);
1, 首先着眼于标识符。那就是func_p : func_p is
2, 因为有括号, 所以先着眼于 *, 那就是 *func_p: func_p is pointer to
3, 解释用于函数的(), 参数是double, 那就是 (*func_p)(double) : func_p is pointer to function(double) returning
4, 最后, 解释数据类型修饰符 int, 那就是 int (*func_p)(double) : fun_p is pointer to function(double) returning int
5, 翻译成中文: func_p 是指向返回类型为int的函数的指针
;p 怎么样, 这方法很有效吧?
再来一个例子:
char * const *(*next)();
1, 首先我们着眼于next, 英文是"next is ";
2, next在括号内, 右边既没有 []
也没有 ()
, 左边有 *
, 所以英文是"next is a pointer to";
3, 接下来上面的式子变成了这个 char *const *()()
, 我们继续解读, ()右边还有 (), 所以是一个函数, 函数没有形参: "next is a ponter to a function(which has no arguments)";
4, 上面读完以后左边有一个 *
, 所以应该继续解读为 "next is a pointer to a function(which has no arguments), and the function return a pointer to";
5, 完成上面一步, 原来的语句就变成了 char * const ()
, 接下来按照规则, const右边没有类型修饰符, 所以const修饰的是左边的星号: "next ... , and the function return a pointer to a read-only pointer";
6, 这下式子已经很简单了, 可谓是"司马昭之心, 路人皆知"(诶?好像有点不对?) char ()
, 所以最终解读为 " next ..., and the function return a pointer to a read-only pointer who's type is char";
7, 翻译成中文: next是一个指针, 它指向一个函数, 函数返回另一个指针, 该指针指向一个类型为char的只读指针(其中函数没有参数).
别人翻译的《征服C指针web版》: 点我
征服C指针
C专家编程 (english version)
支持作者, 请您注册digitalocean的时候用 这个链接 , 这样您可以得到$10!