stackoverflow | C | 在C数组中为什么 a[5] == 5[a]是对的?
原帖链接:http://www.keepsimply.org/2012/07/06/in-c-arrays-why-is-this-true-a5-5a/
作者:独酌逸醉
时间:2012.07.05
声明:翻译仅以技术学习和交流为目的,如需转载请务必标明原帖链接。
来源:http://stackoverflow.com/questions/381542/in-c-arrays-why-is-this-true-a5-5a
水平有限,如有翻译不当,欢迎探讨、批评与指正。
帖子内容:
Dinah:
Joel 在 Stack Overflow podcast #34中指出,在C程序设计语言(aka: K&R)中,都提到了在 C 数组的一个性质:a[5] = 5[a]。
Joel 解释说那是指针运算,但是我仍旧不理解,为什么 a[5] == 5[a] ?
Mehrdad Afshari: 因为 a[5] 相当于 *(a+5) ,5[a] 相当于 *(5+a)。用小学数学我们就可以判断它们是相等的。
这是一种数组作为指针的直接表现方式(This is the direct artifact of arrays behaving as pointers)。"a"是一个内存地址。"a[5]"是距离 a 5 个长度元素的值。元素的地址是 "a+5"。这和从内存地址开始 5 个元素的位置开始偏移 a 个地址是一样的,地址空间是(5+a)。
John MacIntyre: 我想知道是不是和 *(5*sizeof(a)) + a)一样,要是这样的话,就很好解释了。
Mehrdad Afshar: 是的,我没有提到 sizeof 的原因是那样可以很简单把问题解释清楚,加上时候会变得复杂。(I was going to mention the size. but thought I would complicate just things to get the core idea.)
Johannes Schaub - litb : John,不需要使用 sizeof,系统在偏移的时候,自动按照 sizeof 的大小的进行递增的。
Mehrdad Afshari: @Dinah,站在C编译器的角度上说,你是对的。不需要考虑 sizeof,我提到的这些表达式也是类似的(不用考虑sizeof)。然而编译器在生成机器码的时候,会考虑 sizeof 的。如果 a 是一个 int 数组,a[5] 编译器将会使用 mov eax, [ebx+20] 这样的汇编代码来实现,而不是 [ebx+5]。
David Thornley:因为数组的存取方式被定义成指针(的存取方式),a[i] 实现为 *(a+i),它们是可互换的。
笔者:
1.<a href="http://www.cppleyuan.com">C++奋斗乐园</a>曾经有一个类似的帖子,关心这个问题的朋友可以去看看,很不错。 关于二维数组中的元素a[i][j]的访问问题
2.我没有完全把整个帖子翻译完,有一些评分较低的,我就没有翻译。
3.翻译完之后,我觉得这个帖子选择的不太好,内容不够充实。引发我一些思考,我考虑下次翻译要不要找一些文章来翻译。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?