int a1[M][N];
int *a2[M];
int (*a3)[N];
int **a4;
都可以定义二维数组;但是区别很大。二维及多维数组与一维数组不一样,是必须动态申请和释放内存的。
都可以通过a[i][j]来访问。
最难懂的是 int(*a3)[N]的理解。它的意义是"一群" 指针,
每个指针都是指向一个 N 个整数的数组。分配好以后,Ptr 指向一片连续的地址空间,
其中 Ptr[ 0 ] 指向第 0 个 N个整数数组的首地址,Ptr[ 1 ] 指向第
1 个 N个整数数组的首地址。
分配内存如下:
int a1[4][3];
int *a2[4];
int (*a3)[3];
int **a4;
int i,j;
//a2是一个大小为M的数组,存放指向int型的指针;当定义他的时候,编译器就分配了M个int指针型的内存空间
for(i=0;i<4;i++)
a2[i]=(int *)new int*[sizeof(int*)*3];
//首先,a3是一个指针,指向一组(指向包含M个整型数据的指针)的指针
a3=(int(*)[3])new int[sizeof(int)*12];
//在a4定义过程中,编译器并不对其进行内存的分配,因此必须自己管理其内存的分配。
for(i=0;i<4;i++)
a4=(int **)new int *[sizeof(int*)*4];
for(i=0;i<4;i++)
a4[i]=(int *)new int[sizeof(int)*3];