C语言复杂指针声明应如何阅读

6种常用数据分析方法详解:从描述统计到时间序列 数据分析是连接数据与业务决策的桥梁。面对海量数据,掌握描述性统计与对比分析可快速了解现状与差距;相关分析与回归分析能揭示变量间的关联与影响大小;聚类分析用于用户分群,时间序列分析则预测未来走势。这些方法广泛应用于用户画像、销量预测、活动效果评估等场景,是数据分析师和运营人员必备的技能。系统掌握这6种核心方法的使用场景、原理逻辑与实操步骤,能够帮助读者建立完整分析框架,真正用数据驱动业务增长。 阅读详情
 
C语言复杂指针声明应如何阅读
2010年05月11日 星期二 下午 03:41

C语言复杂指针声明应如何阅读

www.firnow.com    时间 : 2008-02-17  作者:佚名   编辑:本站 点击:  312 [ 评论 ]

<iframe scrolling="no" height="15" frameborder="0" width="468" vspace="0" style="left: 0pt; position: absolute; top: 0pt;" src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2974889429954990&output=html&h=15&slotname=8838741374&w=468&lmt=1272257795&flash=10.0.45&url=http%3A%2F%2Fdev.firnow.com%2Fcourse%2F3_program%2Fc%2B%2B%2Fcppsl%2F2008217%2F100104.html&dt=1273563242702&shv=r20100422&prev_slotnames=6749205524%2C8472802220&correlator=1273563242175&frm=0&ga_vid=1882502776.1273563242&ga_sid=1273563242&ga_hid=501973203&ga_fc=0&u_tz=480&u_his=1&u_java=0&u_h=768&u_w=1280&u_ah=690&u_aw=1280&u_cd=24&u_nplug=9&u_nmime=33&biw=1280&bih=502&ref=http%3A%2F%2Fwww.google.com.hk%2Fsearch%3Fhl%3Dzh-CN%26newwindow%3D1%26safe%3Dstrict%26q%3D%25E5%25A6%2582%25E4%25BD%2595%25E9%2598%2585%25E8%25AF%25BBc%252B%252B%26aq%3Df%26aqi%3Dg-g1g2g-g1%26aql%3D%26oq%3D%26gs_rfai%3D&fu=0&ifi=3&dtd=12&xpc=hr5rpSS0Gw&p=http%3A//dev.firnow.com" name="google_ads_frame" marginwidth="0" marginheight="0" id="google_ads_frame3" hspace="0" allowtransparency="true">
-
-
<iframe scrolling="no" height="250" frameborder="0" align="center,center" width="300" src="http://cpro.baidu.com/cpro/ui/uijs.php?fv=10&tn=text_default_300_250&n=diybl_cpr&rsi1=250&rsi0=300&rad=&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%23215670&rss3=%23444444&rss4=%23808080&rss5=&rss6=%23e10900&rsi5=2&ts=1&at=7&if=0&word=http%3A%2F%2Fdev.firnow.com%2Fcourse%2F3_program%2Fc%2B%2B%2Fcppsl%2F2008217%2F100104.html&refer=http%3A%2F%2Fwww.google.com.hk%2Fsearch%3Fhl%3Dzh-CN%26newwindow%3D1%26safe%3Dstrict%26q%3D%25E5%25A6%2582%25E4%25BD%2595%25E9%2598%2585%25E8%25AF%25BBc%252B%252B%26aq%3Df%26aqi%3Dg-g1g2g-g1%26aql%3D%26oq%3D%26gs_rfai%3D&ch=4&lmt=1272257795&csp=1280,768&ccd=24&chi=1&cja=false&cpl=9&cmi=33&cce=true&csl=zh-CN&rt=1&cad=1&aurl=&rss7=&cpa=1&dt=1273563243&pn=3%7Ctext_default_300_250&ev=50331648&jn=3&cn=0" allowtransparency="" marginheight="0" marginwidth="0">
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.  


这段 英文的翻译如下:

右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括 号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。

笔者要对这个法则进行一个小小的修正,应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识 符,但未定义的标识符只会有一个。

现在通过一些例子来讨论右左法则的应用,先从最简单的开始,逐步加深:

int   (*func)(int   *p);

首 先找到那个未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,然后跳出这个圆括号,先看右边,也是一 个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是 int。

int   (*func)(int   *p,   int   (*f)(int*));

func被一 对括号包含,且左边有一个*号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int   *和int   (*)(int*)这样的形参,返回值为int类型。再来看一看func的形参int   (*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。

int   (*func[5])(int   *p);

func右边是一个[]运算符,说明func是一个具有5个元素的数组,func的左边有 一个*,说明func的元素是指针,要注意这里的*不是修饰func的,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结 合,因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的 形参,返回值类型为int。


int   (*(*func)[5])(int   *p);

func被一个 圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个* 号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这 个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。

int   (*(*func)(int   *p))[5];

func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个 int元素的数组。

要注意有些复杂指针声明是非法的,例如:

int   func(void)   [5];

func 是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也 必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返回值不能为数组。

int   func[5](void);

func是一个具有5个元素的数组,这个数组的元素都是函数。这也是非法的,因为数组的元素除了类型必须 一样外,每个元素所占用的内存空间也必须相同,显然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同的。

作 为练习,下面列几个复杂指针声明给读者自己来解析,答案放在第十章里。

int   (*(*func)[5][6])[7][8];

int   (*(*(*func)(int   *))[5])(int   *);

int   (*(*func[7][8][9])(int*))[5];

实际当中,需要声明一个复杂指针时,如果把整个声明写成上面所示的形式,对程序可读性是一大损害。应该用typedef来对声明逐层分解,增强可读性,例 如对于声明:

int   (*(*func)(int   *p))[5];

可以这样分解:

typedef     int   (*PARA)[5];
typedef   PARA   (*func)(int   *);

这样 就容易看得多了。

组态王通过以太网与西门子S7-200 SMART PLC通讯案例详解 通过以上步骤,我们成功实现了组态王与西门子S7-200 SMART PLC的以太网通讯。这一技术不仅提高了工业自动化系统的灵活性和可靠性,还为初学者提供了一个实用的学习案例。希望本文能帮助您快速掌握组态王与西门子S7-200 SMART PLC的通讯技术。如有任何疑问,欢迎留言讨论! 阅读详情

相关推荐

51单片机———UART串口通信

传统理解就是信息的传输与交换。单片机与单片机之间,单片机与电脑之间,以及单片机与各式各样的模块之间都可以进行通信。如果没有通信,那么单片机的功能仅仅局限于它本身,它没办法从其他设备获取有用信息,也无法将自己产生的信息告诉其他设备,这样子单片机与外围器件的合作就会收到限制,没办法完成更多的功能,就像一个没办法拓展业务的公司。:实现我们程序当中写的P0=0xFC,就是一次同时对8位进行信号的输出;习惯上,我们还称P0、P1、P2、P3为单片机的4组并行总线:实现低位先发 高位在后。

m0_74225397的博客 3295

跨域问题(iframe)记录

an ancestor violates the following Content Security Policy directive: “frame-ancestors ‘self’ 场景描述: iframe内嵌jupyter页面; 本地安装jupyter,命令行jupyter notebook开启,在本地开发环境下的页面内嵌入iframe &lt;div id="left...

haliofwu的专栏 2万+

Windows-Anaconda3+TensorFlow安装教程

测试环境:win10-64位和win7-64位 (系统必须是64位,因为TensorFlow目前只支持64位) 一、安装Anaconda3 1.下载Anaconda3 Anaconda官网链接:link 这里我们选择Windows版本,python3.6-version-64位,如下图所示。 2.下载完成之后,点击安装Anaconda3 注意:安装过程中要选择添加环境变量,如图 待安装完成...

DoctorCuiLab的博客 3086

你看糊涂了吗?解析C中复杂的声明

复杂的声明 考虑下面的一个声明: char *(*(*a[])())(); 使用由内到外的阅读方法,并遵循[]和()的结合性强于*的规则,依然很难得到这个声明的准确描述和含义。我们使用另一种方法,“声明模仿使用”: *(*(*a[])())()   是一个     char (*(*a[])())()    是一个     指向char *(*a[])()        是

DuanXu-yzc 972

高通410刷OpenWRT后网络共享配置全攻略

本文详细解析了在高通410设备刷入OpenWRT后,因基带文件丢失导致无法上网的常见问题。核心解决方案是通过SMB网络共享,将备份的原厂基带文件传输至OpenWRT系统并正确还原,从而恢复移动网络连接。文章提供了从备份基带、刷机到配置共享和文件替换的完整操作指南。

grafana6viz的博客 572

FPGA实战:用DDR3和乒乓操作解决视频帧撕裂问题(附Verilog代码)

本文详细介绍了如何利用DDR3内存和乒乓操作架构解决FPGA视频处理中的帧撕裂问题。通过多帧缓存原理、AXI接口配置和自适应乒乓操作设计,有效隔离读写操作,确保视频流稳定传输。文章包含Verilog代码实现和性能优化技巧,适用于工业相机、医疗影像等高速视频处理场景。

m2n3b4v5c6的博客 289

[译]响应式 Iframe - 正确的打开方式

原文作者:BEN MARSHALL 原文链接: Responsive Iframe — The Right Way (CSS Only)! 译者:snow 喜欢理由:让你的 iframe 变成响应式 引言 这周公司安排了一个需求,设计一个响应式布局。由于之前一直在做后台管理系统居多,对这响应式布局几乎是个小白。于是 Google 而之,意外的发现了 iframe 的响应式布局,特来分享。翻...

weixin_34337265的博客 457

别再只测电压了!用STM32G474的ADC玩点花的:过采样提升精度与多通道扫描实战

本文深入探讨了STM32G474系列单片机的ADC高级应用,包括硬件过采样技术实现16位精度和多通道扫描结合DMA的自动数据采集方案。通过详细的配置步骤和实战案例,帮助开发者突破传统电压测量局限,提升信号采集精度和系统效率,适用于工业监控、医疗设备等高精度应用场景。

weixin_42647395的博客 238

雅虎40个优化策略

1、最小化HTTP请求 最终用户响应时间的80%用于前端。大部分时间都在下载页面中的所有组件:图像,样式表,脚本,Flash等。减少组件数量反过来减少了呈现页面所需的HTTP请求数量。这是更快页面的关键。 减少页面中组件数量的一种方法是简化页面设计。但有没有办法构建内容更丰富的页面,同时还能实现快速响应时间?以下是一些减少HTTP请求数量的技术,同时仍支持丰富的页面设计。 组合文件是一种通过将所有...

qq_42066250的博客 1099

利用GBD数据库做未来疾病负担预测

最近看到一篇文献,利用GBD数据库中的数据对疾病负担的发展趋势进行预测。觉得很有趣,就抽空用R语言复盘了一下里面关键的方法。 参考文献: Changing trends in the disease burden of esophageal cancer in China from 1990 to 2017 and its predicted level in 25 years DOI: 10.1002/cam4.3775 1. 相关R包的安装 主要用到的R包有3个,一个一个讲: 1.1 Nordpred

NickyCat的博客 5万+

Python 对接钉钉获取员工上一篇日报或周报内容

摘要:本文介绍使用Python对接钉钉API获取员工日报/周报的方法。首先需创建钉钉应用并开通日志权限,获取员工UserID。通过获取AccessToken进行鉴权,调用topapi/report/list查询日志记录,筛选最新日报/周报后,使用topapi/report/details获取详细内容。需注意权限控制、时间范围筛选和模板匹配等问题。文末提供完整代码示例,并建议扩展自动化触发、数据存储等功能。该方法适用于企业自动化获取员工工作日志的场景。

从技术实践立足,从项目管理方法论延伸思考 807

C语言复杂声明解析

C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的:The right-left rule: Start readin

wangweixaut061的专栏 1万+

【一 扣子客户案例合集】【 1.1 抖音电商:通过扣子智能体重塑电商服务新体验】

**摘要:**抖音电商借助扣子(Coze)智能体平台重塑客服体验,通过无代码开发、多模态交互和跨平台发布等功能,解决了传统客服高峰期压力大、成本高及响应机械等痛点。智能体采用直接面客与人工监管结合模式,实现高效精准服务,并通过解构流程、模块化设计优化系统架构。其技术优势包括零配置学习、意图识别、情绪感知等,实际应用中显著提升客服效率300%以上,改善用户体验。未来将进一步拓展至商品推荐、直播互动等场景,推动电商服务智能化升级。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1569

C 语言 - 指针与const复杂声明完全掌握 | 右左法则详解与实践指南

C语言-指针与const复杂声明完全掌握,右左法则详解与实践指南

欢迎来到Petter_Deng的博客 1822

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【C 语言】指针数据类型 ( 指针步长 | 复杂指针阅读技巧 )

一、指针步长、 二、复杂指针阅读技巧、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3770

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C语言函数指针声明

因为C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是 C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的

a7458969的专栏 2081

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

9、C语言指针专题:C语言复杂指针声明

指针是C语言的核心难点,而复杂指针声明(如数组指针、函数指针、函数指针数组等)更是让初学者望而却步。其核心痛点在于“无法快速判断指针的类型和指向”,而解决这一问题的关键的是掌握和——前者决定了声明中各符号的结合顺序,后者帮助我们快速拆解复杂声明的含义。本文将围绕给定的核心知识点,逐点讲解复杂指针声明的规则、读法和用法,每个知识点及细分点均配套程序段,帮助大家彻底吃透复杂指针声明,突破C语言指针进阶难关。

天涯雨的博客 633

c 语言中的复杂声明

C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标 准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可 以说是相反的。右左法则的英文原文是这样说的: The right-left rule: Start readin

authorowen的专栏 748

15.12【保姆级教程】彻底搞懂C语言复杂声明:从指针数组到函数指针,看完再也不怕“天书”式代码

本文详细解析了C语言复杂声明的阅读和书写技巧。通过拆解三大基础符号([]、()、*)及其优先级规则,提出"从内到外,从右到左"的黄金法则。文章循序渐进地分析指针数组、数组指针、函数指针等基础组合,并通过完整可运行代码示例演示其用法。最后挑战了函数指针数组和指向函数指针数组的指针等复杂声明,帮助读者彻底掌握C语言声明解析方法,克服"看不懂、写不出"的困境。

BackCatK Chen的博客 1138

如何读懂 C 语言复杂的声明

    如何读懂 C 语言复杂的声明 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 参考<<C专家编程>> 废话 虽说 C 语言相比于其他更高级的语言来讲,有着非常精简的语法结构,对于初学者非常的友好。 然而,使用 C 语言依然可以可以写出非常难懂的...

Useless Programmer 的专栏 338

C-复杂的声明的阅读

C-复杂的声明的阅读C语言中有许多魔鬼般的声明,让人看到就害怕, 比如: int ((*p)(int))[5]; 这里p是个什么玩意你知道吗?? 其实,对于C语言中的复杂声明,我们只要掌握了一定阅读原则,想知道这个声明到底声明什么东西就很简单了 阅读原则 前提: 他们的优先级你应该知道 数组的[]与函数的()有同样的优先级 []与()都是从左到由进行结合的 的优先级低于 []与()

motionEnabled 417

C语言指针复杂声明解析

右左法则:首先从最里面的圆括号(未定义的标识符)看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。 int p; 这是一个普通的整型变量 int *p; 首先从p处开始, 先与*结合. 所以p是一个指针, 然后再与int结合. 说明p指向的为int型. 所以p是一个指向整型的指针变量 in

厷ing的专栏 504

20. 【C语言】多级指针与复杂声明

为什么要用二级指针?三级指针、多级指针又是什么鬼?还有那些像咒语一样的复杂声明,到底该怎么读?今天我们就来把这些“高阶指针”彻底拿下。

gugucoding的博客 520

函数指针的复杂声明

C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的: The right-left rule: Start readin

洛神星际 533
上一篇: 优化C语言代码(程序员必读)
下一篇: 内存地址对齐 sizeof
junecau
博客等级 码龄19年 125粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值