`
- 浏览:
965883 次
-
c指针解读之左右法则(转自:http://blog.csdn.net/cattycat/article/details/5660353#quote)
C指针声明解读之左右法则
C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的:
The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till
the whole declaration has been parsed.
这段英文的翻译如下:
右左法则:首先从最里面的圆括号内未定义的标识符开始阅读看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。
总之对声明进行分析,最根本的方法还是按优先级和结合性来类比替换,从那些最基本的声明进行类比,简化,从而进行理解。下面分析几个例子,来具体阐述如何使用这种方法。
#1:int* (*a[5])(int, char*);
首先看到标识符名a,"[]"优先级大于"*",a与"[5]"先结合。所以a是一个数组,这个数组有5个元素,每一个元素都是一个指针,指针指向"int* (int, char*)",很明显,指向的是一个函数,这个函数参数是"int, char*",返回值是"int*"。OK,结束了一个。:)
#2:void (*b[10]) (void (*)());
b是一个数组,这个数组有10个元素,每一个元素都是一个指针,指针指向一个函数,函数参数是"void (*)()"【注:这也是一个函数指针, 参数为空,返回为void】,返回值是"void"。完毕!
#3:int(*)() (*c)[9];
c是一个指针,指针指向一个数组,这个数组有9个元素,每一个元素都是"int(*)()"(也即一个函数指针,指向一个函数,这个函数的参数为空,返回值是int型)。
#4:int (*(*d)[5])(int *);
(*d)------指针;
(*d)[5]------这个指针指向一个数组;
*(*d)[5]------这个数组中每个元素都是指针类型;
int (int *)------ 什么类型的指针?这个类型的。
#5:int (*(*e)(int *))[5];
*e-----向右遇到括号,向左遇到*,说明e是个指针,啥指针呢?
(*e)(int *)------跳出括号向右遇到(int *),说明这个指针是个函数指针,形参为int*, 返回值为何?且听下回分解:);
*(*e)(int *)------返回值为何?向右遇到括号,再向左,喔,遇到*了,那就是返回了一个指针了。啥指针呢? 同样地,下回分解;
(*(*e)(int *))[5]-------向右遇到[],说明那是个指向数组的指针,是啥数组呢?不急,慢慢来;
int (*(*e)(int *))[5]-------向左遇到int,喔,明白了,就是个简单的整型数组。OVER
当然实际当中,当需要声明一个复杂指针时,如果把整个声明写成上面所示的形式,对程序可读性将是一个巨大损害。谁要是写出这样BT的指针声明,那就真是丢rp了,估计会被骂死!。
还是用typedef来对声明逐层分解替换下吧,增强可读性。
例如对于上面的声明:int (*(*func)(int *))[5]; 可以这样分解:
typedef int (*pArr)[5];
typedef pArr (*func)(int *);
这样就容易读得多了啊!
再看看这个啥意思? typedef int (* (* (*FUNC)(int *) )[5] )(int *); ---- 晕了吧。
其实typedef int (* (* (*FUNC)(int *) )[5] )(int *);
等价与下面的:)
typedef int (*PF)(int *);
typedef PF (*PARRAY)[5];
typedef PARRAY (*FUNC)(int *);
(*(void (*)())0)();------->这个呢?
按左右法则:
(void (*)()) -----是一个返回值为void,参数为空的函数指针原型。
(void (*)())0-----把0强转成一个返回值为void,参数为空的函数指针,指针指向的地址为0.
*(void (*)())0-----前面加上*表示整个是一个返回值为void的函数的名字
(*(void (*)())0)()------这当然就是一个函数调用了。
再typedef化简下:
typedef void (*pf)();
(*(pf)0)();
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
主要讲述以http://blog.csdn.net/LCL_data/archive/2009/12/09/4974499.aspx中的链表逆序为模板来讲述指针的使用
包含jdk8 及 jdk9 2个版本。 java8的特点:1....5.最大化减少空指针异常。 JDK9 提供超过 150 项新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具 jshell,以及安全增强、扩展提升、性能管理改善等。
基于Intel(Altera)的Quartus II平台(复制一下就...3、更详细的说明请参考本人博文《https://wuzhikai.blog.csdn.net/article/details/121136040》及《https://wuzhikai.blog.csdn.net/article/details/121152844》。
有些小bug,包括精确定位不好看,水平移动热点不准确。请下载修正版http://download.csdn.net/source/3390149
此实验需要在CodeBlocks等C语言编译平台上完成同时本实验要求所写的程序可以流畅的在编译平台上运行。首先为用户提供一个菜单,展示各个选项的功能,用户可输入一个选项(数字),执行相应的功能,通过运用switch...
博客源码:https://blog.csdn.net/u014411348/article/details/110199522
https://blog.csdn.net/dearmite/article/details/132224055 样子在这篇文章里。 配套资源 后端 小程序轮播图的两种后台方式(jsp)-jsp https://download.csdn.net/download/dearmite/88111567 前端 小程序从轮播图到...
崩坏3桌面端游戏鼠标(光标),已优化,有各种状态的切换(如文字、移动、繁忙、无响应、工作等状态),已经过光标热点校准,还有“德莉傻”彩蛋,崩坏玩家的回忆,电脑美化必备,...https://blog.csdn.net/qq_51273504/
博客地址 : https://hanshuliang.blog.csdn.net/article/details/104083928 I . jintArray 类型说明 II . jboolean 类型说明 III . GetIntArrayElements 方法解析 ( jintArray -> jint* | int* ) IV . jarray...
资源包含文件:设计报告word+源码及可执行EXE文件 本系统通过用一个二维矩阵来描述一个单通道图像的数据,从而...详细介绍参考:https://biyezuopin.blog.csdn.net/article/details/122802257?spm=1001.2014.3001.5502
包含单向链表的插入,删除,遍历 含有前插法,尾插法等链表操作 适用于数据结构初学者使用 线性表的单链表存储结构,整个链表的存取必须...原文链接:https://blog.csdn.net/weixin_73602725/article/details/129270463
资源包含文件:设计报告word+源码程序 1、构造方法第一个参数支持传入canvas dom对象的id,既可以传canvas dom...详细介绍参考:https://biyezuopin.blog.csdn.net/article/details/123097723?spm=1001.2014.3001.5502
matlab勒让德公式原始代码C ++源代码{#c-source-codes align =“ center”} ,ALBANY程序的用法示例,该程序允许为各种基础研究应用程序实现有限元PDE求解器,包括LCM(计算力学实验室),QCAD(量子计算机辅助设计...
仪表指针检测 训练数据.rar 带标注信息 博客地址:https://lw112190.blog.csdn.net/article/details/135952100
C# Onnx yolov8 仪表指针检测 源码.rar 博客地址:https://lw112190.blog.csdn.net/article/details/135952100
这是基于STM32F103ZET6设计的指针式电子钟与日历项目源码。 1. LCD屏采用正点原子3.5寸屏。 2. MCU采用STM32F103ZET6 (就是正点原子战舰开发板) 3. 支持环境温度显示-温度采集采用DS18B20 4. 页面1: 显示指针式电子...
NULL 博文链接:https://747017186.iteye.com/blog/2244691
5.1.1. 函数指针定义: 5.1.2. MSFilterMethod 5.1.3. MBLK_T 5.1.4. MSFilterDesc 5.1.5. MSFilter 5.1.6. MSConnectionPoint 5.2. 传输数据结构 6. API描述 6.1. 传输API 6.2. 语音控制API 6.3. 视频...
https://blog.csdn.net/dearmite/article/details/132266754?spm=1001.2014.3001.5502 本系列校训 用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干! 只要自己有电脑,前后项目都能搞!N年苦学无人问,一...
标准c库大全:C++标准库介绍 疯狂代码 http://CrazyCoder.cn/ ĵ:http:/CrazyCoder.cn/VC/Article12860.html 标准库中提供了C基本设施虽然C标准库随着C标准折腾了许多年直到标准出台才正式定型但是在标准库实 现上...