[转][傲娇]为什么数组下标要从0开始?

本文发布已超过一年,其中的内容可能已经过时。

[傲娇]为什么数组下标要从0开始?
http://www.cse.msu.edu/~wangyua6/?p=764 ←此地址在墙外

相信大部分童鞋,都知道C里数组下标是从0开始的。为毛不从1开始呢?这里,从一个角度来分析,就是多维数组的问题。其实,这世上本没有多维数组,要的人多了,也就有了。本质上,多维数组可以映射到一个一维的数组。好,我们现在开始玩吧。假设这个二维数组是mn的,比如说A[m][n]。 接下来,我们有个一维数组,它是mn的,比如说B[mn]。对于大多数地球人来说,显然,我们可以通过一个一一映射,把A的每一个元素对应到B上。现在我们来看看,数组从0开始和从1开始的区别。

  1. 下标从0开始。这个映射是A->B,就是A[i][j] -> B[i*n+j]。大家有意见吗?检查一下,A[0][0]映射到了B[0]A[m-1][n-1]映射到了B[mn-n+n-1]=B[mn-1]。嗯哼,两端都是对的,应该没意见了吧。
  2. 下标从1开始。这个映射是A->B,就是A[i][j] -> B[i*n+j]。大家有意见吗?检查一下,A[1][1]映射到了B[n+1]A[m][n]映射到了B[mn+n]。囧了吧?其实正确的映射是这样的,对于A[i][j],对应的B里面的下标是(i-1)*n+j=i*n+j-n。各位童鞋自己检验一下吧?可以看到,很不自然地,i减掉了一个1

好了,现在,3维数组映射到1维的区别,就可以当个习题了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

 

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据