首页 > 其他分享 >数组下标从0开始的原因

数组下标从0开始的原因

时间:2022-10-20 09:36:11浏览次数:77  
标签:下标 字节 元素 地址 数组 内存地址 原因

 

对于数组元素的访问在操作系统层其实就是对特定内存偏移量的数据的访问,换而言之即如果想要访问一个数组的某一个元素的值那么首先就要计算它的地址偏移量 ,其大概的公式为:

a[k]_adress = base_address + k*type_size ;

,倘若数组下标是从1开始那么地址计算公式即会转变为:

a[k]_adress = base_address + (k-1)*type_size ;

这对于CPU来说多了一次减法操作

简单一句话: 就是为了方便 计算出每个元素的具体内存地址

 

因为数组变量 实际上在内存上储存的是这个数组变量中第一个元素的的首地址,而系统在取数组中某个元素的值时,必须要得到具体的那个元素的地址才能获取到对应的值

具体每个元素的内存地址 = 数组变量首地址 + 下标 X 每个元素占用的字节数

 

比如:

 int a[5]={10,11,12,13,14}

因为 int每个元素占用4个字节,所以 数组中每个相邻的元素内存地址都相差4,

那么每个元素的地址就等于前一个元素的地址 + 4

a[0] 的内存地址    =    a的地址 + 0 * 4  (第一个元素的地址计算结果  跟数组的首地址一样)

a[1] 的内存地址    =    a的地址 + 1 * 4     (下标是1,内存地址就就是首地址 偏移 4字节)

a[2] 的内存地址    =    a的地址 + 2 * 4    (下标是2,内存地址就首地址 偏移 8字节)

..........

a[5]的内存地址    =    a的地址 + 5 * 4   (下标是5  内存地址就是首地址 偏移 20字节)

 

 如果从1开始 就要减去1,多一步运算,效率自然不让直接点高

所以数组的索引(下标)从0开始 是为了方便计算每个元素的地址.如果从1开始的话 运算起来没有从0开始方便

所以 大部分编程语言数组索引都是从0开始

标签:下标,字节,元素,地址,数组,内存地址,原因
From: https://www.cnblogs.com/yizhiamumu/p/16805240.html

相关文章

  • Java数组快速排序
    https://blog.csdn.net/weixin_44194075/article/details/1138504761.快速排序的思想​通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的......
  • 数组-冒泡排序
    packagecom.beijing.xiaowen.Array;importjava.util.Arrays;publicclassTest01{publicstaticvoidmain(String[]args){//冒泡排序int......
  • ES6数组操作(并、差、交、去重)等操作
    <script>letarr=[1,2,3,4,5,5,4,3,2,1];//1.数组去重letresult=[...newSet(arr)];console.log("result:",res......
  • Go语言数组
    GO语言数组数组的定义方式一:varvariable_name[SIZE]variable_type{}//定长variable_name:=[...]variable_type{}//可变字长packagemainimport"fmt"func......
  • 实验三 数组、指针与现代C++标准库
    实验任务5info.hpp1#include<iostream>2#include<string>3#include<algorithm>4#include<vector>5usingnamespacestd;67classInfo{8......
  • 实验3 数组,指针与现代C++标准库
    task5//Info.hpp#include<iostream>#include<math.h>#include<string>usingnamespacestd;classInfo{public:Info(stringa,stringb,stringc,......
  • 06-Go语言数组和切片
    数组数组初始化 vararr[4]int arr[0]=1 arr[1]=2 fmt.Println(arr) vara=[4]int{1,2,3,4} fmt.Println(a) varb=[4]int{1,2,3} fmt.Println(b......
  • 力扣525(java&python)-连续数组(中等)
    题目:给定一个二进制数组nums,找到含有相同数量的0和1的最长连续子数组,并返回该子数组的长度。 示例1:输入:nums=[0,1]输出:2说明:[0,1]是具有相同数量......
  • 实验3 数组、指针与现代C++标准库
    实验任务5task5.cpp1#include<iostream>2#include<vector>3#include<string>4#include"Info.hpp"5usingnamespacestd;6intmain()7{8cons......
  • React遍历数组的时候报错:key需要保持不一样
    需要加上key值,使每个dom不一样报错:{jigui.map((item,index)=>{return<p>{item?.name}</p>;})}不会报错:{jigui.map((item,index)=>{......