6-1,二维数组的定义方式
1,定义:int[][] arr = new int[3][2];
创建一个二维数组,这个其实是有三个一维数组,一维数组中的每个元素又引用了一个一维数组。
2,打印而为数组:
Sop(arr);直接打印二维数组。 打印[[I@C17164,[[是二维数组的意思,I是int的意思。
Sop(arr[0]);直接打印二维数组中角标为0的一维数组。打印[I@b8e622,[是一维数组的意思。
Sop(arr[0][0]);直接打印二维数组中脚标为0的一位数组的角标为0的元素。打印0。
3,int[][] arr = new int[3][2];
arr[1][1]= 88;
的内存图解:
步骤:
(1)从main函数进入,读到arr局部变量,把arr入栈。
(2)因为arr是数组类型的,所以在堆内存中创建实体,创建一个一维数组,附地址0X0045,并将三个元素初始化为null,因为每个元算又引用到一个一位数组。
(3)堆中的每个元素又是一个一维数组,在堆中新创建三个一维数组,并分配地址值,初始化为0,因为是int型。再把int型数组的地址值赋给之前创建的相应的一位数组的元素。
(4)将数组的引用地址赋值给栈空间的arr,arr指向了0X0045内存地址。
(5)第一句话读完,读下面的一句,给角标为[1][1]的元素赋值为88,这时根据arr的引用地址可以找到0X0045的数组位置,根据第一个[1]可以找到这个数组角标1指向的地址,找到0X0034指向的数组,再根据第二个[1]找到角标为1的元素,这时这个元素是0,然后直接赋值为88,执行完毕。
6-2,创建子数组长度不等的二维数组
方式:
int[][] arr = new int[3][];
//分别对二维数组中的每一个小数组进行初始化
arr[0] = new int[2];
arr[1] = new int[1];
arr[2] = new int[3];
步骤:
(1)从main开始程序,读到int数组型局部变量arr,将arr进栈操作。
(2)arr是一个数组,在堆内存中创建一个一位数组,分配内存地址。
(3)arr有三个元素,创建一个大小为3的一维数组,其中每一个元素又指向了另一个一维数组,所以赋给初始值null。但是因为创建二维数组时是以new int[3][]这种方式创建的,也就是第二个没值,所以这时不能创建那三个一维数组,此时内存中只有最上面的长度为三的一位数组。
(4)将数组的地址赋给栈内存中的arr,arr引用指向堆内存中的数组的地址。
(5)读到第二句,创建了一个一维数组,这时才在内存中创建地址为0X0034的数组,大小为2,初始化元素值为0,并将这个地址赋给原来数组中的[0]号元素。<