二位数组,malloc

/****************************************************************************************************
 数组和指针参数是如何被编译器修改的.
 "数组名被改写成一个指针参数"规则并不是递归定义的.数组的数组会被改写为"数组的指针",而不是"指针的指针"
****************************************************************************************************
              实     参                                所匹配的形式参数
数组的数组     char c[8][10];                    char(*)[10];             数组指针
指针数组       char *c[15];                      char **c;                指针的指针
数组指针(行指针)    char (*c)[64];                char (*c)[64];           不改变
指针的指针          char **c;                     char **c;                不改变      
                                                                                                    
                                                                                                    
 正如上所述, 因此在main()中的参数才能看到 **argv这样的参数,因为*argv[]是指针数组,在编译时会被编译器改写
 成一个指向指针的指针.如果argv是一个数组的数组即(char argv[10][15])它将被编译器改写成char (*argv[15]),
 而不是 char **argv .  

Array=(int **)malloc(nrows*sizeof(int *));//??
Array本质上也是一个指针,只不过它指向指针,是“指针的指针”。
这里给他分配空间,使他可以保存nrows个元素,每个元素都是一个指针int*
这样分配了之后,Array[0]到Array[nrows-1]这里面就保存了nrows个指针,只不过都是野指针,接下来就要让这些野指针变成指向合法地址的指针。

for(i=0;i<nrows;i++)
  Array[i]=(int *)malloc(ncolumns*sizeof(int));//??
依次给Array[0]到Array[nrows-1]这nrows个指针分配空间,每一个都可以保存ncolumns个整数。
原文地址:https://www.cnblogs.com/shuimo/p/2648649.html