首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为什么数组都是从0开始编号

为什么数组都是从0开始编号

作者头像
s_在路上
发布于 2018-12-06 07:27:34
发布于 2018-12-06 07:27:34
1.2K00
代码可运行
举报
文章被收录于专栏:iOS 开发杂谈iOS 开发杂谈
运行总次数:0
代码可运行

数组

数组两个特性

为什么数组都是从 0 开始编号,首先先了解一下数组的概念。 数组 Array 是一种线性表数据结构,是一组连续的内存空间,用来存储一组具有相同类型的数据。数组具备以下特性:

  • 线性表,是数据排列成像一条线一样的结构,每个线性表上的数据最多只有前和后两个方向。比如,除了数组,还有链表、队列和栈。
  • 连续的内存空间和相同类型的数据,正因为这两个特点,才让数组的操作变得非常低效。但是,也正因为这两个特点,可以非常高效的通过下标进行随机访问
寻址公式

一维数组寻址公式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a[k]_address = base_address + k * type_size

二维数组寻址公式: 假设二维数组大小为 m*n,那么寻址公式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a[i][j]_address = base_address + (i * n + j) * type_size

三维数组寻址公式: 假设是 m*n*q,那么寻址公式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a[i][j][k]_address=base_address + (i * n * q + j * q + k) * type_size

其中 type_size 表示数组中每个元素的大小。

验证

例如,声明一个长度为 10int 类型的数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int arr[10] = { 0 };
for (int i = 0; i < 10; i++) {
    arr[i] = i;
}

运行结果如下,

image.png

从运行结果可以看出,计算机给数组 arr,分配了 40 字节的内存,首地址为 0x7ffeefbff4f0arr[0] 地址为:0x7ffeefbff4f0arr[9] 地址为:0x7ffeefbff514,每个 int4 个字节,故 arr[9] 结尾为 0x7ffeefbff514

C 语言中数组名代表首地址,即第一个元素的地址,a[0] 就是偏移为 0 的位置,a[k] 就表示偏移 k 个元素类型大小的位置。得出计算公式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a[k]_address = base_address + k * type_size
结论

如果数组编号从 1 开始计数,那这个公式就会变为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a[k]_address = base_address + k * type_size
a[k]_address = base_address + (k-1) * type_size

对比两个公式,如果从 1 开始编号,每次随机访问数组元素就多了一次减法运算,对于 CPU 来说就是多了一次减法指令,增加了性能开销。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.10.30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解数组
数组是一种基本的线性表数据结构,它用一段连续的内存空间来存储一组具有相同类型的数据。
一行舟
2022/08/25
3620
数组:为什么很多编程语言中数组都从0开始编号?
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
Jingbin
2019/04/19
1K0
数组:为什么很多编程语言中数组都从0开始编号?
数据结构01-数组
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
WindCoder
2020/01/22
7570
4.线性表之数组
数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。Java 语言中提供的数组是用来存储固定大小的同类型元素。
码哥字节
2020/04/07
4130
为什么很多编程语言中的数组都从0开始编号?——你真的了解数组吗?
数组是学习数据结构的开端。尽管数组看起来非常基础、简单,但是有多少人理解数组的精髓呢?
100000860378
2018/11/22
6520
一文了解数组
数据结构算法入门系列的第二篇,这次介绍下数组, 数组是一个最基础而且常见的数据结构,几乎每种编程语言都有。
kbsc13
2019/10/24
5250
算法 - 数组和链表
关于多维数组在内存中的布局参考这篇文章:Memory Layout of Multi-Dimensional Arrays
颇忒脱
2019/03/13
7310
AI_第一部分 数据结构与算法(4.线性表之数组相关)
第四阶段我们进行深度学习(AI),本部分(第一部分)主要是对底层的数据结构与算法部分进行详尽的讲解,通过本部分的学习主要达到以下两方面的效果:
python编程从入门到实践
2019/10/22
5060
AI_第一部分 数据结构与算法(4.线性表之数组相关)
数据结构与算法学习笔记之 从0编号的数组
数组看似简单,但掌握精髓的却没有多少;他既是编程语言中的数据类型,又是最基础的数据结构;
Dawnzhang
2018/10/18
7930
【深度揭秘】为什么很多语言的数组下标是从0开始的?
首先,恭喜你,能够点进来看的,已经领先60%的开发者了。 因为很多人看到标题可能觉得数组从0开始这不本来就这样吗?有什么看头,索性看都不会看,但是你点进来了,说明你还是保持了好奇心的,是具备成为专家的潜力的,这对技术行业来说非常重要。
吴延宝
2020/09/08
1.4K1
01.数组深入浅出分析
数组的初始化。Java中的数组必须先初始化,然后才能使用。所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
杨充
2025/05/22
1290
什么是数组?
今天要介绍的主角就是-数组,数组也是数据呈线性排列的一种数据结构。与前一节中的链表不同,在数组中,访问数据十分简单,而添加和删除数据比较耗工夫。这和什么是数据结构那篇文章中讲到的姓名按拼音顺序排列的电话簿类似。
武培轩
2020/02/17
5360
数组:面试中的疑难点
数组相信大家都不陌生,我们几乎每天都有用到数组,不管是直接由我们自己创建的,还是间接使用sdk内部提供的数据结构,底层都或多或少的离不开数据的使用。
Rouse
2021/01/12
4950
数组:面试中的疑难点
搞定数据结构-数组结构
从数组存储的内存模型来看,“下标”最确切的定义应该是”偏移”,如果用a来表示数组的首地址,a0 就是偏移为0的位置,也就是首地址,a k就表示偏移k个type_size的位置,a的内存地址公式就是_
用户3045442
2019/11/06
4090
Go语言实战之数组的内部实现和基础功能
数组在GO里是切片和映射的基础数据结构,学过其他语言的小伙伴对数组应该都不陌生。基本上所有的语言都会有数组的概念。
山河已无恙
2023/03/02
5900
计算机为什么要从 0 开始计数?
众所周知,计算机是从 0 开始计数,而不是我们平时常用的从1开始计数,但你有想过为什么吗?
五分钟学算法
2020/12/22
1.4K0
计算机为什么要从 0 开始计数?
数据结构:数组内存模型
在计算机里,所有的数据结构本质上其实都可以归为两类:数组和链表。对于链表,我将会在第03 与第 04 讲中着重讲解。今天我将要和你一起探索数据结构中最基本的知识点——数组(Array)。
码农架构
2021/01/22
8980
数据结构:数组内存模型
为什么数组下标是从0开始?
数组寻址——arr[i] = base_address + i * type_size(1)
城市中的游牧民族
2018/10/29
3.4K0
为什么数组下标是从0开始?
数据结构之数组
在 java的API 里面有封装好的容器,那就是ArrayList,那么容器和数组比的话谁更有优势呢? 容器 也就是将数组的细节操作还有数据类型封装起来,还有就是它内部是可以动态扩容的(每次动态扩容的大小为其原来的1.5倍)说到动态扩容会涉及到内存的申请所一说在创建容器数组的时候可以固定给一个值(在知道最大的纯储量的的时候且符合业务场景) 那么如果直接使用数组的话肯定会规避掉一些很细节的问题比如说使用容器内存浪费,还有就是容器是不能为存储值类型的如int,long等 在看专栏的时候有一个问题也就是为什么数组下标的起始值为 0而不为1 ? 数组的计算公式为 a[i]_adress =base_adress +i*date_type_size 从数组的内存模型来看其下标也就是其偏移(offset) 如果用a来表示数组的首地址,那么a[0]也就是偏移量 那么也就是a[k]表示k 个 type_size的位置 ,那么如果从1开始那么还得减1 那么计算地址公式就得多算一步,对于底层来说这一步是很浪费性能的。所以说是从0开始的 写到这个想到数据库的分页也不就是这个理吗?这个得想想。。。。。。
袁新栋-jeff.yuan
2022/05/05
2360
数据结构-数组
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
acc8226
2022/05/17
3840
相关推荐
深入理解数组
更多 >
交个朋友
加入前端学习入门群
前端基础系统教学 经验分享避坑指南
加入前端工作实战群
前端工程化实践 组件库开发经验分享
加入前端趋势交流群
追踪前端新趋势 交流学习心得
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档