C:浅谈数组指针的声明

1. 背景

由于C语言中有数组指针和指针数组,一时间容易混淆,本文试图从语言设计者的角度出发给出一种较为简单的解释办法。

2. 数组和指针声明

我们假设我们只研究 int 相关的变量,那么好,我们现在知道,我们可以声明 int 类型的指针和数组:

int arr[5];
int *p_int;

我们假设我们自己就是C语言的设计师。把这门编程语言设计到这里,一切都是那么和谐。为什么呢?因为我们天然地把指针放在变量的左侧,数组中括号放在变量的右侧。两者清晰明了,且异常简洁。

然后我们面临一个问题:怎样声明一个指针数组?也就是数组中都是指针。

3. 指针数组

本着编译器解析源码的逻辑一致的原则,数组嘛,我们就让它这么写:

int *p_int_arr[5];

到这里,一切都比较和谐,我们为自己的机智感到满意。虽然有的人认为这样有歧义,但是你还是解释到:[]在结合性上比*的优先级高 ,所以大家还是适应一下吧,因为这样写,能保证数组表示一致呀,毕竟数组是需要批量处理的变量啊。

可紧接着,一个新问题就来了—— 怎么声明数组指针呢?就是指向数组的指针

4. 数组指针可能的两种设计

我们之前设计指针时,都希望指针放在变量名的左侧,那么数组指针,我这么写不就行了?

int [5] *i_arr_p; // 错误写法

可这样写不行,我们刚刚还说把数组中括号放在右边,马上这就放到了左边,这样不就更混乱了嘛?

你突然想到,在操作符优先级的控制中,有一个叫小括号的好工具,它可以让优先级低的先去结合。

故你写下:

int (*i_arr_p) [5];

于是你告诉大家,为了保证指针永远在左边,数组永远在右边,那么我设计了这个声明方式。它的含义在于:我先定义了它是一个指针,后说明它指向了一个数组。

可一时间群情激愤,程序员们的抗议声不绝于耳。

不知过了多少年,一个优秀的程序员说:“由于数组在右,指针在左,数组优于指针,括号还可以改变优先级,我们何不整理出一个右左法则?”

5. 右左法则

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 *a;只包含指针,当然是指针类型,然后再去看 int
int a[5];只包含数组,当然是 int 数组了
int *a[5];虽然两者都有,但数组优于指针,所以是 int * 数组
int (*a)[5];虽然两者都有,但变量所在的小括号内只有指针,故为指针,指向了 int 数组
int (*a)(int);先看变量所在的小括号,发现是指针,且是函数指针
int (*a[5])(int);小括号内数组优先级高,所以首先是数组,然后数组中是指针,每个指针还都是函数指针。

以上的情况可以覆盖大部分情况!这就是右左法则,至此,你已经彻底搞懂如何去解析一个变量的声明了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455462.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

迁移学习|ResNet18

一、导入库 二、设置随机种子 三、数据增强和数据加载 四、加载预训练模型 五、定义损失函数和优化器 六、学习率调度器 七、训练模型 八、可视化训练过程 九、总结 1. 常见优化器概述 1.1 随机梯度下降(SGD: Stochastic Gradient Descent) 简介&…

SIP 业务举例之 三方通话:邀请第三方加入的信令流程

目录 1. 3-Way Conference - Third Party Is Added 简介 2. RFC5359 的 3-Way Conference - Third Party Is Added 信令流程 3. 3-Way Conference - Third Party Is Added 总结 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信)…

青少年编程能力等级测评CPA C++(三级)-试卷2

青少年编程能力等级测评CPA C(三级)-试卷2 一、单项选择题(共15题,每题3分,共45分) CP3_2_1.在宽度为500米的河道上,修建一个拦河大坝。施工队每天筑坝50米,由于当时条件…

Qt 实战(11)样式表 | 11.2、使用样式表

文章目录 一、使用样式表1、盒子模型2、应用样式表2.1、全局应用2.2、局部应用2.3、通过文件应用 3、使用样式表实现换肤 前言: 在Qt框架中,样式表(Style Sheets)是一种功能强大的工具,它允许开发者以一种简洁而高效的…

怎么把本地代码上传到阿里云里面

项目需求 将本地项目上传到阿里云,一般有两种情况 1.在本地创建的项目,没有关联过其他的git远程仓库。 2.从其他项目复制的项目代码,但是想要以此项目为基础重新创建一个新的项目。 解决方式 第一种 第一种项目很好解决,就按…

LeetCode题练习与总结:路径交叉--335

一、题目描述 给你一个整数数组 distance 。 从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动 distance[1] 米,向南移动 distance[2] 米,向东移动 distance[3] 米,持续移动。也就是说&#xf…

从安灯系统看汽车零部件工厂的智能制造转型

在当今快速发展的制造业领域,汽车零部件工厂正面临着日益激烈的市场竞争和不断提高的客户需求。为了在竞争中脱颖而出,实现可持续发展,许多汽车零部件工厂纷纷踏上智能制造转型之路。而安灯系统作为一种重要的生产管理工具,在这场…

Nginx可视化管理平台nginxWebUI(1)【保姆级部署方式】

目录 nginxWebUI简介 1.概述: 2.功能 NginxWebUI的部署方式 实验环境: 1.安装JDK环境、nginx和nginx程序 2.启动nginxWebUI 3.使用浏览器登录webUI 访问格式: 登陆成功后我们就来到了它的可视化管理页面 nginxWebUI简介 1.概述&am…

面试总结一

面试总结 1、自我介绍一下自己2.面试11、css常用布局有哪些2、css常用的属性3.js原型链4、开发中遇到的技术难点5、闭包6、ts了解什么呢7.git都用什么命令8、vue怎么打包9.vue启动一个项目需要什么10、vue怎么创建一个项目 2.面试21.vue2和vue3有什么区别2.复杂组件的封装&…

vue-element-admin顶部导航栏的修改

基于vue-element-admin的顶部一级导航栏的调整&#xff0c;因为一级路由过多导致其他元素被挤到第二行&#xff0c;故现在将原来一级路由数组拆分成两个数组&#xff0c;第二个数组以子菜单显示 关键处调整代码 html <el-menu:active-text-color"variables.menuActiv…

如何为自己的跨境网站添加多国语言翻译功能及推荐起尔网定制与插件开发

如何为自己的跨境网站添加多国语言翻译功能及推荐起尔网定制与插件开发 在全球化的浪潮下&#xff0c;跨境电商成为越来越多企业拓展国际市场的重要途径。然而&#xff0c;语言障碍成为了一个不可忽视的问题。为了更好地服务全球用户&#xff0c;为自己的跨境网站添加多国语言…

199116-50-2,Mito-Tracker Orange CMTMRos是一种高亲和力的线粒体染色剂

一、基本信息 中文名称&#xff1a;线粒体橙色荧光探针 英文名称&#xff1a;Mito-Tracker Orange CMTMRos CAS号&#xff1a;199116-50-2 分子式&#xff1a;C24H24Cl2N2O 分子量&#xff1a;427.37 存储条件&#xff1a;避光、冷藏保存&#xff0c;避免长时间暴露于光线…

基于SSM健身国际俱乐部系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;场地类别管理&#xff0c;场地信息管理&#xff0c;运动项目管理&#xff0c;场地类型管理&#xff0c;项目类型管理 用户账号功能包括&#xff1a;系统首页&#xff0c;个人中心…

QML----Webengineview点击网页上的下载没反应,下载文件

问题 使用webe加载网页时&#xff0c;点击下载页面会没有反应。原因就是它默认是关闭下载功能 解决 需要在profile里监听下载事件打开onDownloadRequested,当有下载时会触发这个信号,会获取到一个WebEngineDownloadItem这是下载的东西,查询它的一些相关参数,可以修改路径和开…

网站前端登录加密方案调查

https://zhuanlan.zhihu.com/p/625204114 案例 国家政务服务平台 账号设置 (gjzwfw.gov.cn) 方案 代码混淆Rsa公钥加密https协议 案例 LOFTER&#xff08;乐乎&#xff09; - 让兴趣&#xff0c;更有趣 方案 sha256https Sign in GitLab (secxun.com) 方案 不加密内网 凤凰…

mysql视图介绍(本质,修改数据时的表现,排序覆盖)

目录 视图 介绍 语法 使用 本质 修改数据 排序覆盖 视图 介绍 是一种虚拟表&#xff0c;它不存储实际的数据&#xff0c;而是基于查询结果动态生成数据 将查询结果以表结构保存视图和基表之间会互相影响 视图可以基于一张或多张表来创建&#xff0c;并且可以像普通表一样…

List、Set、数据结构、Collections

一、数据结构 1.1 常用的数据结构 栈 栈&#xff1a;stack,又称堆栈&#xff0c;它是运算受限的线性表&#xff0c;其限制是仅允许在标的一端进行插入和删除操作&#xff0c;不允许在其他任何位置进行添加、查找、删除等操作。 简单的说&#xff1a;采用该结构的集合&#…

Clickhouse笔记(二) 集群搭建

0.集群规划 操作系统使用ubuntu2204server&#xff0c;8C8G100G。 节点分片部署192.168.50.5分片1副本1clickhouse-server/clickhouse-client/keeper192.168.50.6分片1副本2clickhouse-server/clickhouse-client/keeper192.168.60.7分片2副本1clickhouse-server/clickhouse-c…

ECharts饼图-饼图纹理,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个饼图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供详…

day7:软件包管理

一&#xff0c;软件包概述 软件包概述 软件包用于安装&#xff0c;升级&#xff0c;卸载一个软件 软件包类型 二进制包 源码经过了编译&#xff08;而且成功了&#xff09;后产生的包&#xff0c;二进制包是linux下默认的安装包 编译好的文件&#xff0c;直接使用&#xff…