Java和C++数组在内存中存储的区别

Java和C++在内存分配上有一些区别,尤其是数组的创建方面,这里来梳理一下这两者的区别。

1.JAVA 数组

注:必须规定数组的长度,且数组长度终生不变,数组必须先初始化才可以使用,初始化的时候会分配内存;动态初始化和静态初始化不能同时存在。

1.1创建一维数组

动态初始化:只指定数组的长度,具体数据不指定;此时数组元素的值是缺省值.

语法规则:数据类型[] 数组名 = new 数据类型[数组长度];

示例:int arr[] = new int[4];  

arr是引用数据类型,整型数组变量,在栈中开辟内存,存储的是数组首地址;arr[0]、arr[1]、arr[2]、arr[3]都是在堆中,是基本数据类型的整型变量。

静态初始化:定义数组时,直接指定各个元素的值,由元素的个数决定数组的长度。

语法规则:数据类型[] 数组名 = new 数据类型[]{数组元素};

示例:int arr[] = new int[]{1,2,3};     int arr[] = {1,2,3};

1.2创建二维数组

静态初始化:

语法规则:数据类型[][] 数组名 = new 数据类型[][]{{各个一维数组1元素},{各个一维数组2元素}....};

                 数据类型[][] 数组名 = {{各个一维数组1元素},{各个一维数组2元素}...};

示例:      int[][] arr = new int[][]{{1, 2, 3}, {4,5}, {6, 7}};

                int[][] brr = {{1, 2, 3}, {4, 5}, {6, 7}};

动态初始化:

语法规则一:数据类型[][] 数组名 = new 数据类型[一维数组个数][每个一维数组的列数];        此种格式各个一维数组的长度相同

示例:int[][] arr = new int[3][2];

arr在栈区,存的是二维数组的地址,其值为[[I@1774b9b;

arr[0]在堆区,存的是一维数组的地址,其值为[I@104c575;

arr[1]在堆区,存的是一维数组的地址,其值为[I@3fa5ac;

arr[2]在堆区,存的是一维数组的地址,其值为[I@95cfbe;

arr[0][0]在堆区,是一维数组arr[0]的第一个元素;其值为0

语法规则二:数据类型[][] 数组名 = new 数据类型[一维数组的个数][];

该方式没有直接给出一维数组的长度,其长度可在后面动态的给出,各个一维数组的长度可以不同.

示例:int[][] arr = new int[3][];

在堆中分配了二维数组的单元,各个二维数组的元素只是一维数组名,其值是null;此时,堆中并没有分配一维数组,之后还需要一维数组的分配内存代码。

//之后动态的为每个一维数组分配空间

arr[0] = new int[2];

arr[1] = new int[3];

arr[2] = new int[1];

因此,Java二维数组可以用一张图来表示:

总结:Java二维数组中每一行中的元素是连续的,各个行之间的元素地址不连续,但每一行的首地址是连续存储的,首地址在栈中存储。

2.C++数组

2.1一维数组

一维数组:

定义方式:

datatype arrayname[length]

初始化方式:

1),可以只给部分赋值

int a[5] = {1,2};   剩下的自动赋值为0

2),如果给全部元素赋值,那么在数组定义时可以不给出数组长度

int a[] = {1,2,3,4}; 

存储结构如图:

二维数组:

在内存中是连续排列的,按行排列。

初始化方式:

1),按行分段赋值

int a[2][2] = {{1,2},{3,4}};

2),按行连续赋值

int a[2][2] = {1,2,3,4};

3),可以只对部分赋值,未赋值的自动取0

int a[3][3] = {{1}, {2}, {3}};

4),如对全部元素赋初值,则行数可以不给出

int arr[][3] = {1,2,3,4,5,6,7,8,9};

总结:C++中,数组是连续存储的,需要注意的是二维数组是“按行排列”。

需要注意的是:malloc或new的数组存在堆中;全局变量或静态局部变量的数组存在全局数据区;局部变量的数组存在栈区。

二维数组存储结构如下:

总结:Java和C++对于数组的存储结构用一句话来总结其实就是是否连续存储的。C++中数组时连续存储的,JAVA中数组首地址是连续存储的。 

猜你喜欢

转载自blog.csdn.net/Searchin_R/article/details/82937034
今日推荐