为什么数组从0开始

为什么C语言的数组从零开始呢?我觉得要理解这个问题,首先要有两个概念——地址偏移


注意下面两个语句:

array[10]

*(array+10)

这两条语句都是指向同一个元素。这两条语句是等价的。


即是说,array[0]就是*(array+0)


数组的下标就是对array这个数组进行偏移。这是硬件特性决定的。

因为数据都是存放在内存地址里的,而数据的获取方式,是先得到一个数据的地址,然后对其进行偏移。


如果数组从1开始计算,那么获取数组的第一个元素表达方式就是array[1]

但是数组的第一个元素的地址就是array,CPU每次获取元素需要减去1。

即必须这样做:*(array + 1 - 1)

其中+1操作是数组的下标,-1操作是为了获得正确的元素地址。

如果数组从1开始,会多了减1这个操作,增加了CPU的运算,浪费CPU资源。


为了提高CPU的效率,只需要简单把数组从1开始修改为从0开始就可以了。



如果还不是很明白,可以看一下等差公式

an=a1+(n-1)d

其中n是第n个,d是两个数之间相差的数,这里设为1。


于是CPU为了获取数组的第n个元素,首先获得a1的地址,然后再从该地址出发,加上n-1,此时的地址就是所需的元素地址。但是每次都要进行-1操作,-1操作也是要消耗时间的,这样很浪费CPU资源。于是语言设计者决定数组从0开始,这样这公式就可以化为

an=a0+n

少了-1这一步骤,提高了CPU的效率。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值