1、二维数组的初始化
int arr[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,7,6,5}
}
编译器如何分配空间:
int arr[3*4] = {1,2,3,4,5,6,7,8,9,7,6,5};
反汇编:
二维数组反汇编和一位数组没有区别,都是一段连续的内存空间;
编译器将维度相乘来获得需要分配的内存空间大小;
总之二维数组只是为了实现程序员看代码更加直观的功能;
2、给定部分值
如果只给定部分值,其它值会在编译时补0;
int arr[3][4] = {
{1,2},
{5},
{9}
}
int arr[3][4] = {
{1,2,3,4,5},
{5},
{9}
}
3、省略里面的{ }
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10};
因为编译时二维数组和一位数组没有本质的区别,所以省略里面的大括号是可以通过编译的;
如果只给定部分值,剩下的值会补0;
4、省略长度
二维数组的第一个长度可以省略 ,编译时会根据第二个长度自动分组,不足一组的补0;
例如:下面的数组会分成3组,因为编译器直到每组有4个元素,会从前往后自动分成3组;
int arr[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
分成三组,最后一组补两个0:
int arr[][4] = {1,2,3,4,5,6,7,8,9,10};
分两组:
int arr[][4] = {1,2,3,4,5,6,7,8};
注意:这样是错误的 ->int arr[3][];
如果是这样,编译器只直到分成3组,而每组的元素个数无法确定,不好判断是否该补0之类的;
5.总结
1、一维数组与多维数组在反汇编上没有区别.
2、数量如果不够,其他的值会补零.
3、不允许超过维度的最大长度.
4、可以省略里面的{ }
5、可以省略第一维的值
6.寻找多维数组中的数据
例如:二位数组int[5][12];
编译器寻找arr[1][7]的值时:
->arr[1*12+7]
如果是数组:int arr[n][m][k][w][r]
寻找:arr[2][3][4][2][2]
->arr[2*m*k*w*r+3*k*w*r+4*w*r+2*r+2]