Java中的数组
java中的数组是引用数据类型,在方法内声明定义的数组会在栈空间中存放该数组的引用,其数组将开辟在堆空间中。也就是说在栈空间中存放的是该数组的首地址,而真正的数组存放在堆空间中,通过这个首地址来去调用数组的各个元素。
一维数组 :
int[] arr = new int[4];
内存解析 :
二维数组 :
int[][] arr = new int[3][2];
内存解析 :
可见,java中的二维数组实际上就是一个一维数组中的各个元素也是一维数组,每一个元素都对应一个一维数组实体。
C\C++中的数组
在C语言和C++中,通常在函数内定义的数组空间都是开辟在栈空间的,将栈中一段连续的空间分配给数组,数组的名字是这块空间的首地址。由于数组在栈中申请一块连续的空间,这块空间的大小必须提前确定,所以数组不能动态分配内存空间。( 若需动态分配内存则要使用C语言中的malloc函数或者C++中的new运算符将其开辟在堆空间中 )
一维数组 :
int arr[4];
二维数组 :
int arr[3][2];
实际上,C语言中二维数组申请内存空间的时候是在栈中线性开辟内存的,为顺序存储。虽然是二维数组,编译器在申请内存空间的时候,也是线性分配的内存空间。所以二维数组可以当做一维数组看待。
举例证明 :
定义一个数组,将其看做三行两列 :
#include <iostream>
using namespace std;
int main()
{
int arr[3][2] = {{1, 2},
{3, 4},
{5, 6}};
cout << "arr[1][1] = " << arr[1][1] << endl;
cout << "arr[0][3] = " << arr[0][3] << endl;
return 0;
}
运行结果 :
arr[1][1] = 4
arr[0][3] = 4
由于arr[1] [0] 对应的是第四个元素,arr[0] [3] 对应的也是第四个元素,所以输出的元素是相同的,证明了二维数组是连续存储的结论。
而在java中,此写法会报数组角标越界的异常,另一方面证明了java中的二维数组不是完全连续存储的。
两者主要区别
-
C\C++中的数组若在函数体内声明且不使用malloc函数或者new关键字,其内存是在栈空间中开辟的。而java中的数组为引用数据类型,在方法内声明时是在堆空间中开辟内存。
-
C\C++中的多维数组是顺序存储线性结构的,而java中的多维数组则是树形结构。
C\C++ :
java :