数组下标为什么从0开始

定义一个数组:    int[] a=new int[5]

           数组在内存中是一个连续的存储空间 这个空间有一个首地址 也就是第一个元素所在的地址,比如说是1a2b3c4d
        那么这个a实际是数组变量 它存的只是个地址,它不能把整个数组都存进去没有那么大的地方,
        也就是a--->1a2b3c4d  也就是说通过a变量可以找到这个数组,
        再说 数组下标为什么从0开始计算,从1开始不是更符合计数习惯,
        对于数组来说下标从0开始好计算,比如 a数字的地址是1000 
        a[0]代表a数组的第一个元素,系统要先找到这个元素,首先要计算出这个元素的地址,
        计算方式  1000+0*4  4代表int四个字节  结果是1000  那么a[0]的地址就是1000,
        同时 a[1]的地址 1000+1*4=1004   
                 a[2]的地址 1000+2*4=1008
                 a[3]的地址 1000+3*4=100C (地址是16进制 10=A 11=B 12=C 13=D 14=E 15=F)
如果下标从1开始计算的话
a数组的首地址 是1000 计算第一个元素的地址的时候就是 a[1]=1000+(1-1)*4=1000  
那么a[2]的地址就是  1000+(2-1)*4=1004  所以每次计算下一个地址
都要进行-1操作 就不如用0计算起来速度快 从0开始提高了访问数组元素的效率
(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的数组中。当你声明一个数组时,栈空间储存这个数组名,但没有内存地址;
        当你实例化这个数组时,JVM会在堆空间中分配一块连续的空间保存数组,
        但是JVM并不会给这个数组中的每一个元素分配一个地址,只会给这个数组分配一个首地址,
        然后栈空间中的数组名指向这个首地址。数组中的每一个元素的地址实际上是相对数组首地址的偏移量。
        即数组元素是以偏移地址的形式访问的。
发布了551 篇原创文章 · 获赞 1 · 访问量 9044

猜你喜欢

转载自blog.csdn.net/xiaoyaGrace/article/details/104004233