惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
D
DataBreaches.Net
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
人人都是产品经理
人人都是产品经理
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
腾讯CDC
博客园_首页
The Cloudflare Blog
S
SegmentFault 最新的问题
C
Check Point Blog
美团技术团队
爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
A
About on SuperTechFans
Blog — PlanetScale
Blog — PlanetScale

Jiajun的技术笔记

你好,2026! TiDB 源码阅读(六):TiDB Coprocessor 源码解析 性能优化的核心思想 TiDB 源码阅读(五):索引 TiDB 源码阅读(四):AST、逻辑计划、物理计划 CockroachDB Serverless Architecture podman 无故退出 Cursor Control-L (CTRL-L) Keyboard Shortcuts in Terminal Replace docker with podman Using xmonad with xfce4 A RC script for freebsd frpc 自己动手写一个k8s controller AI 会取代你的(编程)岗位吗? 自建DERP服务器提升Tailscale连接速度(使用Nginx转发) 自动升级Docker容器 再读《程序员修炼之道-从小工到专家》 让浏览器下载文件 再读《软件随想录》/《黑客与画家》/《软技能》 HTTP 压力测试中的 Coordinated Omission 2的补码 编程语言中的 context 是什么? flutter macOS 构建出错 Flatpak 使用小记 Golang CAS 操作是怎么实现的 PostgreSQL 当MQ来使用 Clash 结合 工作VPN 的网络设计 使用 PostgreSQL 搭建 JuiceFS PostgreSQL 配置优化和日志分析 有GitHub Copilot?那就可以搭建你的ChatGPT4服务 窗口函数的使用(以PG为例)
如何解读c的声明
2015-03-17 · via Jiajun的技术笔记

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)