C:浅谈数组指针的声明

news2025/10/25 3:39:05

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.coloradmin.cn/o/2222520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot3响应式编程全套-Spring Security Reactive

目录 传送门前言一、整合二、开发1、应用安全2、RBAC权限模型 三、认证1、静态资源放行2、其他请求需要登录 四、授权 传送门 SpringMVC的源码解析(精品) Spring6的源码解析(精品) SpringBoot3框架(精品) …

云+AI 时代的 OceanBase

2024 年 10 月 23 日,OceanBase 年度发布会在北京成功举办。会上,CEO 杨冰表示,OceanBase将继续践行一体化产品战略,不断演进产品能力,从支撑关键业务负载的OLTP能力,到实时分析的AP能力,再到应…

Unity Apple Vision Pro 保姆级开发教程 - Simulator 模拟器使用

教程视频 Apple VisionPro Simulator 模拟器使用教程 Unity Vision Pro 中文课堂教程地址: Unity3D Vision Pro 开发教程【保姆级】 | Unity 中文课堂 ​ VsionOS Simulator 简介 visionOS Simulator 是一个用于开发和测试 visionOS 应用程序的工具。它模拟 Appl…

Return code 0x40450037 (Not a valid nxos image)

1.问题描述 硬件:C93180YC(Nexus NXOS) 软件版本:Release 9.3.8 需要描述:需要将Nexus93180从Release 9.3.8升级到10.3.6(M),在执行操作的时候,发现如下问题&#xff…

从0到1学习node.js(npm)

文章目录 一、NPM的生产环境与开发环境二、全局安装三、npm安装指定版本的包四、删除包 五、用npm发布一个包六、修改和删除npm包1、修改2、删除 一、NPM的生产环境与开发环境 类型命令补充生产依赖npm i -S uniq-S 等效于 --save -S是默认选项npm i -save uniq包的信息保存在…

[实时计算flink]基于Paimon的数据库实时入湖快速入门

Apache Paimon是一种流批统一的湖存储格式,支持高吞吐的写入和低延迟的查询。本文通过Paimon Catalog和MySQL连接器,将云数据库RDS中的订单数据和表结构变更导入Paimon表中,并使用Flink对Paimon表进行简单分析。 背景信息 Apache Paimon是一…

Elasticsearch如何搜索日志并存储

Elasticsearch 是一个分布式搜索引擎,擅长对大量数据进行实时的搜索、分析和存储。它常被用于处理日志数据,配合工具如 Logstash 或 Filebeat 来收集和存储日志,并提供强大的搜索和分析能力。接下来,我将解释 Elasticsearch 如何处…

8年经验之谈 —— 如何使用自动化工具编写测试用例?

以下为作者观点,仅供参考: 在快速变化的软件开发领域,保证应用程序的可靠性和质量至关重要。随着应用程序复杂性和规模的不断增加,仅手动测试 无法满足行业需求。 这就是测试自动化发挥作用的地方,它使软件测试人员…

NVR小程序接入平台/设备EasyNVR多个NVR同时管理的高效解决方案

在当今的数字化安防时代,视频监控系统的需求日益复杂和多样化。为了满足不同场景下的监控需求,一种高效、灵活且兼容性强的安防视频监控平台——NVR批量管理软件/平台EasyNVR应运而生。本篇探讨这一融合所带来的创新与发展。 一、NVR监测软件/设备EasyNV…

【设计模式】MyBatis 与经典设计模式:从ORM到设计的智慧

作者:后端小肥肠 🍇 我写过的文章中的相关代码放到了gitee,地址:xfc-fdw-cloud: 公共解决方案 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: 【设计模式】揭秘Spri…

vue2 el-select赋值无效(无法选中)

背景:点击添加明细时,el-table会新增一条数据,其中,存货原申购用途 会根据 费用承担事业部 下拉框的值改变而改变,所以每次费用承担事业部发生变化时,都需要清空存货原申购用途的值 最开始是直接这样写的&a…

D. Deleting Divisors

传送门:Problem - D - Codeforces 题意: 思路:博弈论 打表找规律( 递推 ) 如果 ans[i] 为 true ,则 Alice 能赢 ans[i] 为 false,则 Bob 会赢 数字 n 的一个因子 为 x , 如果 …

【简历】25届浙江某211大学JAVA简历:明明项目有货,但是长篇大论减分!!

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 另外:我们出这一系列校招简历指导的原因,就是看很多学生被忽悠,没有先定位大厂、中厂还是小公司,导…

【日志】力扣刷题——买卖股票的最佳时机 // Unity——添加数据表文件、EPPlus插件以及编辑器开发生成Excel转Json代码文件复习

2024.10.17 【力扣刷题】 两题连一起,思路很像 121. 买卖股票的最佳时机 - 力扣(LeetCode) 122. 买卖股票的最佳时机 II - 力扣(LeetCode) 121. 买卖股票的最佳时机 按照顺序查找,找到最大的差值时&#x…

Prompt-Tuning方法学习

文章目录 一、背景1.1 Pre-training1.2 Fine-Tuning1.3 高效微调(SOTA PEFT)1.4 基于强化学习的进阶微调方法(RLHF) 二、Prompt-Tuning技术2.1 发展历程2.2 Prompt模板构建方式 三、基于连续提示的Prompt Tuning四、Q&A 一、背…

【升华】一文从0到1到实际性应用大语言模型(LLM)

一、前言 相信网已经很多LLM大模型 的介绍 ,概念,发展历史,应用场景的很多文章,但是很多文章都是缺少细节的描述,到底怎么用,需要些什么东西怎么层显出来。所以虽然看了很多大模型的介绍,也仅仅…

【Linux篇】初学Linux,如何快速搭建Linux开发环境

文章目录 前言1. Linux背景介绍1.1 UNIX的发展历史1.2 Linux的发展历史 2. 企业应用现状3. 开源3.1 探索Linux源代码3.2 开源 VS 闭源 4. Linux的版本4.1 技术线4.2 商业产品线 5. os概念,定位6. 搭建Linux环境6.1 Linux环境的搭建方式6.2 购买云服务器 7. 使用XShe…

从一个简单的计算问题,看国内几个大语言模型推理逻辑能力

引言 首先,来看问题: 123456*987654等于多少,给出你计算的过程。 从openai推出chatgpt以来,大模型发展的很快,笔者也经常使用免费的大语言模型辅助进行文档编写和编码工作。大模型推出时间也好久了,笔者想…

红队-安全见闻篇(上)

声明 学习视频来自B站UP主 泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一.编程与开发 1.后端语言学习 C语⾔:⼀种通⽤的…

[解决]在Arduino IDE 打开 ino 类型文件处于read only editor模式

今天打开一个ino类型文件发现这个问题,无法编辑…… 解决方法:右键点击ino类型文件(你打开的那个)进入属性栏 发现只读被勾上,取消打勾并点击最下方的确认 现在就可以编辑啦