本文发布已超过一年,其中的内容可能已经过时。
[傲娇]为什么数组下标要从0开始?
http://www.cse.msu.edu/~wangyua6/?p=764 ←此地址在墙外
相信大部分童鞋,都知道C里数组下标是从0
开始的。为毛不从1
开始呢?这里,从一个角度来分析,就是多维数组的问题。其实,这世上本没有多维数组,要的人多了,也就有了。本质上,多维数组可以映射到一个一维的数组。好,我们现在开始玩吧。假设这个二维数组是m
乘n
的,比如说A[m][n]
。 接下来,我们有个一维数组,它是mn
的,比如说B[mn]
。对于大多数地球人来说,显然,我们可以通过一个一一映射,把A
的每一个元素对应到B
上。现在我们来看看,数组从0
开始和从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]
。嗯哼,两端都是对的,应该没意见了吧。 - 下标从
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维的区别,就可以当个习题了。