c语言二维数组下标负数是什么意思~?

来源:百度知道 编辑:UC知道 时间:2024/05/16 12:33:59
如 static int a[3][4]={{1,2,3},{4,5,6}}, i;
i= a[2][-2] + a[1][3];
a[2][-2]是什么意思?
还有~这个是大学c语言考试题~放入tc中运行会输出i=6~~

1 在C语言中,二维数组的下标可以为负数,表示指向前面的元素
2 对于二维数组 int arr[M][N]来说,arr[i][j]的地址是 (*arr)+i*N+j,其值是*((*arr)+i*N+j)
3 分析本题

数组a在初始化时后,其元素按照在内存中的排列顺序依次为1,2,3,0, 4,5,6,0, 0,0,0,0
数组a的第一个元素的地址为*a(或&a[0][0]或a[0]),记为p,
则,a[2][-2]的地址就是 p+2*4+(-2) 即p+6,即指向第7个元素,其值为6;
同理,a[1][3]的地址为p+1*4+3,即p+7,即指向第8个元素,其值为0
所以i的值为6

在这里这不是一个错误,但是一般不会写这样的程序。
首先应该理解语言中数组的存储结构。对二维数组,在内存中实际是按行存储的,也就是说二维数组中元素是按行依次存储在一片连续的的空间中。

取某个元素时,是先通过计算这个元素的地址,再通过计算得来的地址取得该元素的。依然以二维数组为例,设数组a[rows][cols](即有rows行,cols列),当访问a[i][j]的时候,是先通过i,j的值计算得到要取的元素的地址,再在这个地址上取得该值的。计算地址的方法是: a + i*cols + j, 这里a就是数组名,它实际存放着上是这个数组的每一个元素的地址。

因此,对于您的问题, 可能计算得到a[2][-2]的元素地址为 a+2*4 + (-2) = a + 6 = a + 1*4 + 2
它的地址与元素a[1][2]的地址一样,也就是说a[2][-2]与a[1][2]实际上是同一个元素。因此输出6,这是正常的现象。

着因该是 错误的``````

数组的下标是从0开始的`````
不可能有 -2;

有什么不懂 你可以给我短信```

确实很奇怪,应该是错的.

我想那是一个错误,这是明显的数组越界~ 学这么长时间c语言,我从来就没有见过~