转载

解读 C 指针的声明

27 Sep 2014

2015-03-17 更新:

最近在看《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的只读指针(其中函数没有参数).

2014-10-17:

别人翻译的《征服C指针web版》: 点我

2015-03-17:

征服C指针

C专家编程 (english version)

禁止转载, 谢谢

支持作者, 请您注册digitalocean的时候用 这个链接 , 这样您可以得到$10!

正文到此结束
Loading...