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