最右边的下标最先变化(变化最快):
int a[3][2] ——>a[0][0], a[0][1], a[1][0]],a[1][1], a[2][0],a[2][1] 第一个元素:a[0][0], 最后一个元素:a[2][1]。
所以,a[2][2]或者a[-1][1]均超越a数组界限(之外)。C语言不能检出这类错误。“在运行时增加对数组下标的范围检查是不切实际的。”事实上下标范围检测被认为并不值得加入到C语言中。
回wlsui朋友:
可以通过一个指向数组a第一个元素的指针p来访问整个数组,但也可以让指针指向数组任何一个元素,这样就可以访问从该元素之后的数组片段。有些人(主要是Fortran程序员)用另一种方法扩展这种技巧。他们让指针p指向数组前面一个位置的地址(a[-1])这样就可以使数组的下标从1到N,而不是从0到N-1。 如果你和许多Fortran程序员一样在编程算法中已经习惯了数组下标从1到N,那么这个技巧对你可能很有吸引力。不幸的是,这个手段完全为标准所不容(标准第6.5.6节,“Additive operators”作了明确禁止)而且这个做法确实被特别地标注为可能引起未定义的行为。所以你千万不要告诉别人是我告诉了你这个方法。 要取得Fortran 程序员所需要的效果其实非常简单:只要在数组的声明中让它的长度比所需要的多1,这样数组的下标范围就是0到N。然后只是用1到N就行了。不必疑惑,不必惊诧,就是这么简单。
————摘自《C专家编程 》第9章 再谈数组
|