黑马程序员技术交流社区

标题: 二维数组问题 [打印本页]

作者: 古银平    时间: 2012-5-18 14:31
标题: 二维数组问题
int[][]=new int[3][4]中,在堆内存中是不是定义了两个一位数组?不是很理解?
作者: 李保成    时间: 2012-5-18 14:35
呵呵 直接上图说明:
作者: 李保成    时间: 2012-5-18 14:41
首先明确一点,楼主你的数组命名错了,只给出二维数组,却没给数组起名字。呵呵。
以int[][] arr=new int[3][4]为例好了,剖析一下这个吧,首先在栈中创建了一个类型为int数组的变量arr,然后在堆中开辟了一块儿名为new int[]数组结构的内存空间,初始值都为null,它里边包含了3个一维数组,每个一维数组里边的元素都是4个。哦了吧?
作者: 李文富    时间: 2012-5-18 15:32
本帖最后由 李文富 于 2012-5-18 15:35 编辑

恩,对于这个问题涉及到底层操作,首先得明白二维数组并不是说定义两个一维数组来拼接成二维数组,在内存中数组都是使用连续地址来存放的,可能我要和你讲下指针这个概念用于二维乃至多维数组的作用;如:int[][] 这里int[]在编译的时候是一个指针而不是一个一维数组,后面的那个[]才是代表数组;举个例子:假如军队里有一个连队,一个连队有3个排长每排10,你就是这个连的连长。要找连队里的张三(2排10号)时,你先找到张三所在排的排长,然后从这个排里找到张三这个人;我们实现这个例子时,定义 int[2][9] 下标从0起;这时int[0]指向第一排排长所在内存位置,int[0][0]表是第一个排长,同理int[1] ,int[1][0],所以张三的位置是int[2][9];
这样能明白不?
补充下多维数组,也就把更多int[][][]..[]看成是级联的指针;
作者: 彩虹    时间: 2012-5-18 15:45
       内存是一段连续的空间,是按地址从低到高来存储数据的,来一个数就将其按地址的顺序存储到相应位置,这就说明内存在存储二维数组时,不可能像我们看到的那样,真的开辟一个矩阵的存储空间来存储它。而是将二维数组中的元素,按照选定的存储顺序:行优先或列优先,将其元素一个一个的存储到内存的一段连续地址码中
      按行优先:先存a[0][0],再存a[0][1],再存a[0][2],再存a[0][3],依次存完第一行,再存储第二行的元素,方法一样
      按列优先:先存a[0][0],再存a[1][0]。再存a[2][0],再存a[3][0],依次存完第一列,在存储第二列的元素,方法相同
在存储时每个元素都对应唯一的一个地址,所以当要取二维数组中的某个元素时,也会很容易找到对应的值,二维数组的存储就是这样的,其实就是在一维数组的基础上,增加了一个行优先或列优先的存储机制而已,实质都差不多,都是将数组中的元素存储到一段连续的内存地址上,都是线性存储的
作者: 我能驾驭住    时间: 2012-5-18 16:19
int[][]=new int[3][4]
没有数组名:格式:元素类型[] 数组名=new 元素类型[元素个数或数组长度];
应该是int[][] arr=new int[3][4]
不用想太多一样的,3是几个一维数组,4是一维数组里面的个数有几个?
一共个数3*4=12
表示是从下标0开始:arr [0][0],arr [0][1],arr [0][2],arr [0][3];
                           arr [1][0],arr [1][1],arr [1][2],arr [1][3];
                           arr [2][0],arr [2][1],arr [2][2],arr [2][3];
这样一次存放....................................
一维就不用解释了int[]x= new int[3]   里面三个元素:x[0],x[1],x[2];...................
这么直白明白否?
作者: 杨康    时间: 2012-5-18 19:02
int[][] a = new int[3][4]这个意思是定义了一个名为a的int型的二维数组,第一个[3]表示的是这个二维数组的长度是3,是由3个一维数组构成的,也就是说这个二维数组的角标[0][4],[1][4],[2][4],每个角标位里都是一个一维数组。而定义的第二个中括号[4],是你定义的二维数组里包含的一维数组的长度,也就是说你每个一维数组的长度都是4。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2