为什么数组下标是从0开始?

简介: 也不是所有的高级程序语言都是如此,比如Python数组下标就支持负数。

也不是所有的高级程序语言都是如此,比如Python数组下标就支持负数。

原因一:历史原因

语言出现顺序从早到晚C、Java、JavaScript。
C语言数组下标是从0开始->Java也是->JavaScript也是。
降低额外的学习和理解成本。

原因二:减少CPU指令运算

(1)下标从0开始:

数组寻址——arr[i] = base_address + i * type_size(1)

其中base_address为数组arr首地址,arr[0]就是偏移量为0的数组,即数组arr首地址;i为偏移量,type_size为数组类型字节数,比如int为32位,即4个字节。

(2)下标从1开始:

数组寻址——arr[i] = base_address + (i -1)* type_size(2)

比较两个计算公式可以发现公式(2)每次CPU寻址需要多一次 i-1的操作,即多了一次减法的指令运算。

对于数组这种基础数据结构,无论在哪种高级程序语言中,都是频繁间接(作为容器的基础数据结构,比如Java的ArrayList)或者直接被使用的,因此要尽量减少其消耗CPU资源。

原因三:物理内存的地址是从0开始的

计算机主存是多个连续字节大小的单元组成的数组,每个字节都对应唯一的物理地址,第一个字节的地址为0。

目录
相关文章
|
5月前
|
编译器
数组的下标法和指针法查找数组中元素的不同
总结文档的时候遇到了这个问题。在CSDN上看到一篇博客觉得有缺漏和误导性,所以自己总结一下。
42 0
|
3月前
|
存储 算法 Java
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
42 0
|
3月前
|
算法
leetcode-34:在排序数组中查找元素的第一个和最后一个位置
leetcode-34:在排序数组中查找元素的第一个和最后一个位置
17 0
|
4月前
|
索引
数组下标为什么从0开始
数组下标为什么从0开始
|
6月前
|
算法
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
29 0
|
8月前
|
前端开发
数组下标对应缺位问题
数组下标对应缺位问题
33 0
|
9月前
|
算法 C语言 C++
【二分查找】34. 在排序数组中查找元素的第一个和最后一个位置
二分查找是一种高效的查找算法,其时间复杂度为 O(log n)。在许多情况下,我们需要在一个有序数组中找到某个目标值的搜索范围。本文将介绍一种基于二分查找的搜索范围查找算法,该算法能够快速找到目标值在数组中的起始和结束位置。
48 0
|
10月前
|
算法
每日一题—— 在排序数组中查找元素的第一个和最后一个位置
每日一题—— 在排序数组中查找元素的第一个和最后一个位置
|
算法
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置
84 0
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置
【LeetCode】错误的集合&&在排序数组中查找元素的第一个和最后一个位置&&杨氏矩阵&&寻找数组的中心下标&&两个数组的交集
【LeetCode】错误的集合&&在排序数组中查找元素的第一个和最后一个位置&&杨氏矩阵&&寻找数组的中心下标&&两个数组的交集
【LeetCode】错误的集合&&在排序数组中查找元素的第一个和最后一个位置&&杨氏矩阵&&寻找数组的中心下标&&两个数组的交集