读懂复杂C声明的黄金法则
在网上遇见felix,他让我读 http://www.felix021.com/blog/read.php?2072,读完之后觉得收获很大,需要练习一下。
黄金法则:从声明的变量开始,先向右看,再向左看,再向右看,再向左看 。。。
如果向右看的时候遇到),则一直向左看,直到遇到(跳出这层括号。然后再重复向右看,向左看。
举例说明:
例子1
int a;
a 的右边什么都没有,向左看int,说明a是一个int型变量。
例子2
char *a;
向右看,什么都没有; 向左看是*, 说明a是一个指针; 再向右看,什么都没有; 再向左看是char,说明a是一个指向char的指针。
例子3
int *a[];
向右看,[]说明a是一个数组;向左看,*说明数组的每个元素是个指针;再向右看,什么都没有; 再向左看,int,每个指针指向一个整数。综合来看,a是一个数组,数组每个元素指向整数。
例子4
int * const a;
向a右边看,什么都没有。一直向左看,先是const,说明a是不可修改的,然后是*,说明a是一个指针;然后是int,说明指针指向整数。综合来看,a是一个不可修改的指针,它指向整数。
例子5
void (*checkout)();
向右看,遇见)返回,再向左看是*,说明checkout是个指针。再向右看,是(),说明这个指针指向函数; 向左看是void,说明函数返回void。总的来看, checkout是一个指向返回void的函数的指针。
例子6
void (*checkout[])()
向右看,[]说明checkout是一个数组;向左看, *说明数组每个元素是个指针。向右看,遇见)返回;再向左看,遇见(返回。再向右看,是(),说明数组内每个指针指向函数; 向左看是void,说明每个函数返回void。
总的来看, checkout是一个数组,数组内都是指向返回void的函数的指针。
例子7
void (*(*checkout)[])()
向右看,遇见)返回; 向左看,*说明checkout是个指针,遇到(跳出一层()。向右看,[]说明checkout指向的是一个数组;向左看, *说明数组每个元素是个指针。向右看遇见),向左看遇见(,跳出一层()。向右看,()说明数组每个元素指向一个函数;再向左看,void说明每个数组元素指向的函数返回void。
总结:checkout是一个指针,指向一个数组,每个数组元素都是一个指向返回void函数的指针。
我了个去,有点头大了。据说c++的面向对象和多态就是靠函数指针和函数指针数组实现的。
读懂复杂C声明的黄金法则的更多相关文章
- 从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路
本文原作者阮一峰,作者博客:ruanyifeng.com. 1.引言 HTTP 协议是最重要的互联网基础协议之一,它从最初的仅为浏览网页的目的进化到现在,已经是短连接通信的事实工业标准,最新版本 HT ...
- [转帖]从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路
从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路 http://www.52im.net/thread-1709-1-2.html 本文原作者阮一峰,作者博客:r ...
- 一篇文章读懂JSON
什么是json? W3C JSON定义修改版: JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式,并不是 ...
- 大数据篇:一文读懂@数据仓库(PPT文字版)
大数据篇:一文读懂@数据仓库 1 网络词汇总结 1.1 数据中台 数据中台是聚合和治理跨域数据,将数据抽象封装成服务,提供给前台以业务价值的逻辑概念. 数据中台是一套可持续"让企业的数据用起 ...
- 一文读懂Redis常见对象类型的底层数据结构
Redis是一个基于内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件.Redis支持五种常见对象类型:字符串(String).哈希(Hash).列表(List).集合(Set)以及有序集合( ...
- 一文读懂Java动态代理
作者 :潘潘 日期 :2020-11-22 事实上,对于很多Java编程人员来说,可能只需要达到从入门到上手的编程水准,就能很好的完成大部分研发工作.除非自己强主动获取,或者工作倒逼你学习,否则我们好 ...
- C#基础之IL ,轻松读懂中间代码IL 转载
[No0000152]C#基础之IL,轻松读懂IL 先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.n ...
- 一文读懂数仓中的pg_stat
摘要:GaussDB(DWS)在SQL执行过程中,会记录表增删改查相关的运行时统计信息,并在事务提交或回滚后记录到共享的内存中.这些信息可以通过 "pg_stat_all_tables视图& ...
- Java8 函数式【1】:一文读懂逆变
Java8 函数式[1]:一文读懂逆变 禁止转载 pure function 协变 逆变 Java8 引入了函数式接口,从此方法传参可以传递函数了,有人说: 不就是传一个方法吗,语法糖! lambda ...
随机推荐
- LeetCode题解:(221) Maximal Square
题目说明 Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's a ...
- js 添加事件兼容性
var tools = { //添加事件 addHandle: function (e, type, handle) { if (e.addEventListener) { e.addEventLis ...
- 【HLSDK系列】overview(俯视图)
温馨提示:使用PC端浏览器阅读可获得最佳体验 阅读本文时,请时不时就对照参考图看一下. 什么是overview? 如果你有使用过3D模型制作工具,例如3dsMax等等,在编辑模型时这些软件通常会展示四 ...
- 【Java】提取JSON数值时遇到数组集合时使用的K-V方式转换
1.实体类转换方法 参照文章:http://www.cnblogs.com/dflmg/p/6933811.html 2.K-V方法(此方法比较笨,但是没有办法,我现在不知道有没有相关的简单API,只 ...
- SDOI2017遗忘的集合
题面链接 咕咕咕 题外话 为了这道题我敲了\(MTT\).多项式求逆.多项式\(ln\)等模板,搞了将近一天. sol 最近懒得写题解啊,随便搞搞吧. 看到这个就是生成函数套上去. \[F(x)=\p ...
- Linux下的wine生活(QQ/微信/Office)
My wine life like windows 本篇内容涉及QQ.微信.Office在wine中的使用配置. QQ 到deepin下载轻聊版. 如果安装了crossover,那么将其中opt/cx ...
- TCP: time wait bucket table overflow解决方法
/var/log/messages 中出现大量的 TCP: time wait bucket table overflow 引起该现象的原因是服务器tcp的连接数太多,超出了内和定义的最大数 临时改变 ...
- lumen 增加视图路径
在 ServiceProvider 里面加上 app('view')->addLocation(module_path('Develop') . '/resources/views');
- ural 2029 Towers of Hanoi Strike Back (数学找规律)
ural 2029 Towers of Hanoi Strike Back 链接:http://acm.timus.ru/problem.aspx?space=1&num=2029 题意:汉诺 ...
- PythonCodingRule简略