首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数组:为什么很多编程语言中数组都从0开始编号?
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
Jingbin
2019/04/19
1K0
数组:为什么很多编程语言中数组都从0开始编号?
为什么很多编程语言中的数组都从0开始编号?——你真的了解数组吗?
数组是学习数据结构的开端。尽管数组看起来非常基础、简单,但是有多少人理解数组的精髓呢?
100000860378
2018/11/22
6390
深入理解数组
数组是一种基本的线性表数据结构,它用一段连续的内存空间来存储一组具有相同类型的数据。
一行舟
2022/08/25
3490
4.线性表之数组
数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。Java 语言中提供的数组是用来存储固定大小的同类型元素。
码哥字节
2020/04/07
4050
数据结构01-数组
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
WindCoder
2020/01/22
7470
算法 - 数组和链表
关于多维数组在内存中的布局参考这篇文章:Memory Layout of Multi-Dimensional Arrays
颇忒脱
2019/03/13
7190
一文了解数组
数据结构算法入门系列的第二篇,这次介绍下数组, 数组是一个最基础而且常见的数据结构,几乎每种编程语言都有。
kbsc13
2019/10/24
5170
什么是数组?
今天要介绍的主角就是-数组,数组也是数据呈线性排列的一种数据结构。与前一节中的链表不同,在数组中,访问数据十分简单,而添加和删除数据比较耗工夫。这和什么是数据结构那篇文章中讲到的姓名按拼音顺序排列的电话簿类似。
武培轩
2020/02/17
5290
数据结构与算法学习笔记之 从0编号的数组
数组看似简单,但掌握精髓的却没有多少;他既是编程语言中的数据类型,又是最基础的数据结构;
Dawnzhang
2018/10/18
7810
AI_第一部分 数据结构与算法(4.线性表之数组相关)
第四阶段我们进行深度学习(AI),本部分(第一部分)主要是对底层的数据结构与算法部分进行详尽的讲解,通过本部分的学习主要达到以下两方面的效果:
python编程从入门到实践
2019/10/22
4900
AI_第一部分 数据结构与算法(4.线性表之数组相关)
数据结构:数组内存模型
在计算机里,所有的数据结构本质上其实都可以归为两类:数组和链表。对于链表,我将会在第03 与第 04 讲中着重讲解。今天我将要和你一起探索数据结构中最基本的知识点——数组(Array)。
码农架构
2021/01/22
8740
数据结构:数组内存模型
01.数组深入浅出分析
数组的初始化。Java中的数组必须先初始化,然后才能使用。所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
杨充
2025/05/22
1070
搞定数据结构-数组结构
从数组存储的内存模型来看,“下标”最确切的定义应该是”偏移”,如果用a来表示数组的首地址,a0 就是偏移为0的位置,也就是首地址,a k就表示偏移k个type_size的位置,a的内存地址公式就是_
用户3045442
2019/11/06
3940
【深度揭秘】为什么很多语言的数组下标是从0开始的?
首先,恭喜你,能够点进来看的,已经领先60%的开发者了。 因为很多人看到标题可能觉得数组从0开始这不本来就这样吗?有什么看头,索性看都不会看,但是你点进来了,说明你还是保持了好奇心的,是具备成为专家的潜力的,这对技术行业来说非常重要。
吴延宝
2020/09/08
1.4K1
计算机为什么要从 0 开始计数?
众所周知,计算机是从 0 开始计数,而不是我们平时常用的从1开始计数,但你有想过为什么吗?
五分钟学算法
2020/12/22
1.4K0
计算机为什么要从 0 开始计数?
数组:面试中的疑难点
数组相信大家都不陌生,我们几乎每天都有用到数组,不管是直接由我们自己创建的,还是间接使用sdk内部提供的数据结构,底层都或多或少的离不开数据的使用。
Rouse
2021/01/12
4880
数组:面试中的疑难点
数据结构-数组
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
acc8226
2022/05/17
3720
Go语言实战之数组的内部实现和基础功能
数组在GO里是切片和映射的基础数据结构,学过其他语言的小伙伴对数组应该都不陌生。基本上所有的语言都会有数组的概念。
山河已无恙
2023/03/02
5760
为什么数组下标是从0开始?
数组寻址——arr[i] = base_address + i * type_size(1)
城市中的游牧民族
2018/10/29
3.4K0
为什么数组下标是从0开始?
Algorithms_基础数据结构(01)_线性表之数组&数组的应用案例分析
给你一个文件里面包含全国人民(14亿)的年龄数据(0~180),现在要你统计每一个年龄有多少人? 给定机器为 单台+2CPU+2G内存。不得使用现成的容器,比如map等。
小小工匠
2021/08/17
3670
相关推荐
数组:为什么很多编程语言中数组都从0开始编号?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档