如何解读c的声明
2015-03-17 更新: ~~~~~~~~~~~~~~~~~
最近在看《C专家编程》, 结合《征服C指针》对上次的笔记做了一部分修改:
如何阅读C的声明? 用英语阅读, 按照以下步骤:
1, 首先着眼于标识符(变量名或者函数名)
- 依照优先顺序解释派生类型(指针、数组和函数).优先顺序如下:
- ��数组和函数).优先顺序如下:
::
2.1 用于整理声明内容的括弧
2.2 后缀操作符: 用于表示数组的[], 用于表示函数的()
2.3 用于表示指针的*
3, 解释完派生类型, 使用”of”、”to”、”returning”将他们连起来
4,最后, 追加数据类型修饰符(在左边, int, double等), 对于const关键字,
如果右边紧跟类型修饰符(如int, double等), 则它作用于类型修饰符,
否则作用于左边紧邻的\ *
\ 指针星号, 并且虽然const意思是常量,
把它解读为\ read-only
\ 才更加正确
5,英语不好的人, 可以倒序用中文解释
注意读完一部分就把那一部分换成()忽略掉.
比如:
.. code:: c
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 怎么样, 这方法很有效吧?
再来一个例子:
.. code:: c
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版》:
`点我 <http://avnpc.com/pages/c-pointer>`__
2015-03-17:
征服C指针 <http://www.amazon.cn/%E5%9B%BE%E7%81%B5%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E4%B8%9B%E4%B9%A6-%E5%BE%81%E6%9C%8DC%E6%8C%87%E9%92%88-%E5%89%8D%E6%A1%A5%E5%92%8C%E5%BC%A5/dp/B00BKU37NG/ref=sr_1_1?ie=UTF8&qid=1426599089&sr=8-1&keywords=%E5%BE%81%E6%9C%8Dc%E6%8C%87%E9%92%88>
__
C专家编程 <http://www.amazon.cn/C%E4%B8%93%E5%AE%B6%E7%BC%96%E7%A8%8B-%E8%8C%83%E5%BE%B7%E6%9E%97%E7%99%BB/dp/B00BHSPPDQ/ref=sr_1_1?ie=UTF8&qid=1426599140&sr=8-1&keywords=c%E4%B8%93%E5%AE%B6%E7%BC%96%E7%A8%8B+%E8%8B%B1%E6%96%87%E7%89%88>
__
(english version)
更多文章
- socks5 协议详解
- zerotier简明教程
- 搞定面试中的系统设计题
- frp 源码阅读与分析(一):流程和概念
- 用peewee代替SQLAlchemy
- Golang(Go语言)中实现典型的fork调用
- DNSCrypt简明教程
- 一个Gunicorn worker数量引发的血案
- Golang validator使用教程
- Docker组件介绍(一):runc和containerd
- Docker组件介绍(二):shim, docker-init和docker-proxy
- 使用Go语言实现一个异步任务框架
- 协程(coroutine)简介 - 什么是协程?
- SQLAlchemy简明教程
- Go Module 简明教程