如题所述
在这里这不是一个错误,但是一般不会写这样的程序。
首先应该理解语言中数组的存储结构。对二维数组,在内存中实际是按行存储的,也就是说二维数组中元素是按行依次存储在一片连续的的空间中。
取某个元素时,是先通过计算这个元素的地址,再通过计算得来的地址取得该元素的。依然以二维数组为例,设数组a[rows][cols](即有rows行,cols列),当访问a[i][j]的时候,是先通过i,j的值计算得到要取的元素的地址,再在这个地址上取得该值的。计算地址的方法是:
#include<stdio.h>
int NagativePos(int b[4][4])
{
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(a[i][j] < 0)
{
printf("第bai一个du负数zhi为第dao%d行,zhuan第%d列",i,j);
return 1;
}
}
}
return 0;
}
void main()
{
int a[4][4],i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
scanf("%d",&a[i][j]);
}
}
NagativePos(a);
}
扩展资料:
二维数组A[m][n],这是一个m行,n列的二维数组。设a[p][q]为A的第一个元素,即二维数组的行下标从p到m+p,列下标从q到n+q,按“行优先顺序”存储时则元素a[i][j]的地址计算为:
LOC(a[i][j]) = LOC(a[p][q]) + ((i − p) * n + (j − q)) * t
按“列优先顺序”存储时,地址计算为:
LOC(a[i][j]) = LOC(a[p][q]) + ((j − q) * m + (i − p)) * t
存放该数组至少需要的单元数为(m-p+1) * (n-q+1) * t 个字节
参考资料来源:百度百科-二维数组
首先应该理解语言中数组的存储结构。对二维数组,在内存中实际是按行存储的,也就是说二维数组中元素是按行依次存储在一片连续的的空间中。
取某个元素时,是先通过计算这个元素的地址,再通过计算得来的地址取得该元素的。依然以二维数组为例,设数组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,这是正常的现象。