C数组与java数组在内存中的区别

C数组:静态数组,数组一旦被定义后,占用的内存空间就是固定的,不能改变数组长度。

C有两个版本,C89和C99

在C89中,必须使用数值常量指明数组的长度,不能使用变量(不管变量有没有被初始化);

在C99中,可以使用变量指明数组的长度,但它仍是静态数组,一旦确定长度后,长度就不能改变了。


一维数组:

定义方式:

datatype arrayname[length]


数组是一个整体,在内存中是连续的;

malloc或new的数组存在堆中;

全局变量或静态局部变量的数组存在全局数据区;

局部变量的数组存在栈区。

注意segment fault的时候,字符串常量在文字常量区.  char *p = "www.baidu.com";


初始化:

1),可以只给部分赋值

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


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

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


char str[] = "C program";
printf("%d ", sizeof(str)/sizeof(char)); // 10   数组长度是10
printf("%d", strlen(str)); // 9   字符串长度是9


二维数组:

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


初始化:

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};


java数组:

必须规定数组的长度,且数组长度终生不变

数组必须先初始化才可以使用,初始化的时候会分配内存;动态初始化和静态初始化不能同时存在。


一维数组:

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

数据类型[] 数组名 = new 数据类型[数组长度];

int arr[] = new int[4];   arr是引用数据类型,整型数组变量,在栈中开辟内存,存储的是数组首地址;

  arr[0]、arr[1]、arr[2]、arr[3]都是在堆中,基本数据类型的整型变量。


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

数据类型[] 数组名 = new 数据类型[]{1,2,3,4};

数据类型[] 数组名 = {1,2,3,4};


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

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


二维数组:  特点是在堆内存中,各个一维数组的元素是连续的,但各个一维数组之间不是连续存放的。

动态初始化:

1) 数据类型[][] 数组名 = 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



2)数据类型[][] 数组名 = new 数据类型[一维数组的个数][];

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


int[][] arr = new int[3][];

System.out.println(arr);                //[[I@175078b

System.out.println(arr[0]);    //null

System.out.println(arr[1]);    //null

System.out.println(arr[2]);    //null


在堆中分配了二维数组的单元,各个二维数组的元素只是一维数组名,其值是null;

此时,堆中并没有分配一维数组,之后还需要一维数组的分配内存代码。


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

arr[0] = new int[2];

arr[1] = new int[3];

arr[2] = new int[1];

System.out.println(arr[0]);           //[I@42552c

System.out.println(arr[1]);           //[I@e5bbd6

System.out.println(arr[2]);           //[I@8ee016

System.out.println(arr[0][0]);       //0


3)数据类型[][] 数组名 = 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}};

 

此种方式,所有的地址、元素值都一下就分配好了。






你可能感兴趣的:(java,c)