计算机无论是记文件的地址也好,记什么都只记录首地址,数组中第一个地址就是和数组中第一个数的地址重合 所以数组下标从0开始
计算机只记录开头比特点(第一个字节的地址)的地址 即物理存储单元的地址 每一片区域第一个字节的地址
原因:
-
-
- 比如只记录这的地址
- 计算机取值的时候 int类型数组 每个占四字节
- 设第一个为x 则第n个就是 x+4*(n-1)
- 其他类型同理
-
理解版本
数组在内存中申请是,所申请的内存是一段连续的内存地址;
例:int[] a=new int[3];申请一段:int 数据类型的数组,a 为变量,数组长度为:[3];
这个数组所申请的内存地址是连续的(假设所申请的:第一个内存地址为:1008,第二个为:1009,第三个为:1010);,但我们只知道:一、变量:a,它只拿到第一个内存地址1008;二、它的数组空间为3个;
a[0]——把a拿到的内存地址:1008 + 0 = 1008 (指向第一个内存地址);
a[1]——把a拿到的内存地址:1008 + 1 = 1009 (指向第二个内存地址);
a[2]——把a拿到的内存地址:1008 + 2 = 1010 (指向第三个内存地址);
所以:数据下标从 [0] 开始的意义也在于此!在获取的时候不用再长度减1了(当然,这是理解版的)。
为什么有的语言下标为0有的语言下标为1
经过反编译发现在汇编中获取地址是(eax为数组下标)
c#,c++,c(下标从0开始):mov [edx+eax*4 + 08],ecx, 0*4+8(起始地址)
易语言和lua(下标从1开始):汇编步骤太多就不贴了 为: 1*4+4 (起始地址)
从汇编语句的多少都可以看出,下标为0更符合计算机的计算方式,但是下标为1更加符合人的习惯容易入门