一.
接下讨论数组中特殊的一部分。数组是一个容器,用来存储数据的。现在数组中存储的不再是int,double..的类型了,而是存储的数组。
数组中的元素还是数组,我们把它称之为数组中的数组,也就做二维数组。维度增加了一层。
二
二维数组的基本定义
→(这个数组里面存放的还是数组)→(最里面装的是int类型元素)
这就是定义了一个二维数组,但是数组需要长度,里面有几个一维数组。
这个代表着有三个小箱子,每个小箱子里有两个小格子。这个书写的形式挺奇怪的。
对二维数组的定义的理解:先通过new创建一个数组new [],接着数组中装的元素也是数组new [][],数组里装的数组里面的元素是int类型,new int[][],然后每一个数组都有固定的长度。二维数组要明确数组里面装了几个数组,每个数组里有几个元素,new int[3][2]。为了操作创建好的数组,给它命名arr=new int[3][2], 名字叫arr的变量是什么类型?元素为int类型的二维数组类型 int [][] arr=new int[3][2]。
这里还有一点要注意的就是格式问题,数组的符号[]可以移动,三种写法都可以,int[][] arr,int[] arr[],int arr[][]。
二. 二维数组的应用
打印二维数组是什么样的?
对于二维数组而言,arr[0]代表的是二维数组里的第一个一维数组。
现在我们想操作二维数组中的第一个一维数组里的0角标元素。
连续两个数组符号[],它们分别代表的含义是不同的。第一个数组符号[]代表的是第几个一维数组,第二个数组符号里面的数字代表的是某个一维数组中的第几位元素。arr[0][0]代表的是二维数组中第0位数组中的第0位元素。
这里有一点,二维数组的输出arr[0]打印出来的内容是什么样的?
先介绍二维数组在内存中的图解。
首先,arr在函数中,属于局部变量,在栈中。右边式子中有new新建的数组,因此其在堆中开辟内存空间。之所以两者分开了存储,就在于它们之间是一个引用的关系,和直接用常量赋值变量int a=4的方式不一样,堆中的对象是靠的编号的,它把编号给栈中的变量,靠这个编号两者之间搭上关系。
对于二维数组的分析是一步步来的,以new int[3][2]为例,先明确二维数组的长度,二维数组的长度为3,上面截图中的虚线格子代表就是一维数组,0,1,2代表的是二维数组的长度是3,每一个里面角标里面都是一个一维数组。
上面的截图体现了二维数组在内存中分布的意思,但是这么画是错误的。开辟一个空间出来,0是由默认初始化的值,那这里面是什么?它这里本身就应该存数组,如果没有数组,应该存什么?(),因为数组是实体,当没有实体时 ,引用型数据类型的默认值就是null(代表着没有任何指向)。int类型的默认值是0,double默认值是0.0。
任何一个实体,在堆内存中产生,它里面的数据都会进行默认初始化。这是系统自动完成的。接着问题就来了,一维数组在哪儿?
一维数组也是个实体,是要是实体,都要在堆内存中开辟空间,所以一维数组也要自己独立的开辟一个内存空间,同时分配了一个地址空间。接着把这个地址空间送入对应的位置。
上面的右侧截图后,二维数组才真正的初始化完毕。紧接着二维数组把地址给arr,然后arr就可以指向二维数组。