Leecason

vuePress-theme-reco Leecason    2018 - 2020
Leecason Leecason

Choose mode

  • dark
  • auto
  • light
主页
分类
  • CSS
  • FrontEnd
  • GraphQL
  • JavaScript
  • TypeScript
  • Vue
  • Webpack
  • 其它
  • 数据结构与算法
  • 浏览器相关
标签
时间线
GitHub
author-avatar

Leecason

80

Article

61

Tag

主页
分类
  • CSS
  • FrontEnd
  • GraphQL
  • JavaScript
  • TypeScript
  • Vue
  • Webpack
  • 其它
  • 数据结构与算法
  • 浏览器相关
标签
时间线
GitHub

数组为什么从 0 开始编号

vuePress-theme-reco Leecason    2018 - 2020

数组为什么从 0 开始编号

Leecason 2020-04-15

# 数组是一种线性表数据结构

线性表(Linear List),就是数据排成一条像线一样的结构,每个线性表上的数据最多只有前和后两个方向。链表,队列,栈等也是线性表结构。

非线性表,如二叉树,堆,图等,数据之间不是简单的前后关系。

# 数组随机访问

a[i]_address = base_address + i * data_type_size

通过公式计算出数组下标对应的内存地址,从而实现随机访问

# 为什么从 0 开始编号

从数组存储的模型看,“下标”最确切的定义是“偏移(offset)”。

如果从 1 开始编号

a[k]_address = base_address + (k-1) * data_type_size

  • 每次随机访问都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令
  • C 语言设计者用 0 开始计数数组下标,之后的语言都效仿了 C 语言,为了在一定程度上减少学习成本