二维数组在内存中如何分配

例如:int arr【5】【】 到底arr【0】——arr【5】如何分配的

int arr[5][]; 这样的定义是无法编译通过的。

因为你没有给出二维数组的第二个维度。即可以写成 int arr[][5],或者int arr[3][5]。
也就是说,定义二维数组时必须写明第二个维度,而第一个维度可以给也可以不给,如果不给第一个维度,编译器会根据你的初始化语句自动决定第一维度。
二维数组在内存中其实是一个平坦的一维数组,下面具体说明:
int arr[3][5] 和 int arr[15] 所使用的内存区大小是一样的,都是15*sizeof(int)个字节。
如果你做下面这样一个定义:
union{
int a[3][5];
int b[15];

}U;

你会发现
U.a = &U.b
U.a[0] == &U.b[0]
U.a[1] == &U.b[5]
U.a[2] == &U.b[10]
&U.a[2][3] == &U.b[13]

规律是: &U.a[m][n] == &U.b[m*5+n],其中5就是数组a的第二维度。
实际上,二维数组在运行时也是用这样的公式转化为对一维数组的访问。

上面是C/C++的规则,JAVA中则完全是另外一种情况了。
在JAVA中一切都是对象,int a[5][]; 定义了一个数组a,他有5个元素分别是a[0], a[1], a[2],a[3], a[4],因为你没有给第二维度,所以a[0]~a[5]都是还没有赋值的,需要你另外赋值。
既然JAVA中一切都是对象,这个数组当然是在堆内存中了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-01
int arr[2][2];
这样的数组在内存中必然连续分配四个int的空间,顺序为:arr[0][0] arr[0][1] arr[1][0] arr[1][1]追问

这个我当然知道,我想问的是,java中引用都是分配在栈内存中,地址指向位置为堆内存中,那么到底二位数组中的一位数组放在栈还是堆内存。

追答

java?你是在C++分类下提问的。
静态数组都是分配在堆中的,因为内存没有“矩阵”这种形式,因此都是线性存储的,二维数组的第一维记录的是第二维的起始地址。C++98标准下,不允许第二维为[]空而不赋值定义,java的不清楚。

追问

好吧 没注意度娘把问题自动分到c++的,那不好意思。java里是允许第二维为[]空,因为各个一维数组的长度都可以不一样。

追答

你可以调整一些分类,到java分类下。

第2个回答  2014-04-01
把二维数组按行或按列存储 就像你举得例子 先存arr(1)(1)——arr(1)(),再存arr(2)(1)--arr(2)(),就这样一直把要存的存完
第3个回答  2014-04-01
连续的,凑字数
相似回答