前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么数组都是从0开始编号

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

作者头像
s_在路上
发布2018-12-06 15:27:34
1.1K0
发布2018-12-06 15:27:34
举报
文章被收录于专栏:iOS 开发杂谈

数组

数组两个特性

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

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

一维数组寻址公式:

代码语言:javascript
复制
a[k]_address = base_address + k * type_size

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

代码语言:javascript
复制
a[i][j]_address = base_address + (i * n + j) * type_size

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

代码语言:javascript
复制
a[i][j][k]_address=base_address + (i * n * q + j * q + k) * type_size

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

验证

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

代码语言:javascript
复制
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
复制
a[k]_address = base_address + k * type_size
结论

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

代码语言:javascript
复制
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 条评论
热度
最新
推荐阅读
目录
  • 数组两个特性
  • 寻址公式
  • 验证
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档