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}};
此种方式,所有的地址、元素值都一下就分配好了。