多维数组分析

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]
 
 
posted @ 2019-09-23 10:53  L丶银甲闪闪  阅读(241)  评论(0编辑  收藏  举报