定义一个数组: 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并不会给这个数组中的每一个元素分配一个地址,只会给这个数组分配一个首地址,
然后栈空间中的数组名指向这个首地址。数组中的每一个元素的地址实际上是相对数组首地址的偏移量。
即数组元素是以偏移地址的形式访问的。
|
|