int (**p)[2]
首先p本身的数据类型是int(**)[2],是指针类型,不是数组,p存储的内容是地址,p指向的数据类型为int(*)[2]。
p指向的数据类型,即*p本身(或者写成p[])的数据类型为int (*)[2],也是指针,即*p存储的内容也是地址。
*p指向的数据类型,即**p本身(或者写成p[][])的数据类型为int[2],可以看成指针,存储的内容也是地址,指向一个含有2个元素的数组的首地址。
**p指向的数据类型,即***p本身(或者写成p[][][])才是int型数据。
那么要申请含有n个int(*)[2]元素的数组,并用p指向这个数组的地址,方法如下
//不是int (**p)[2] = new (int(*)[2])[n];
//也不是int (**p)[2] = new ((int(*)[2])[n]);
int (**p)[2] = new (int (* [n])[2]);
p[0] = new int[m][2];
p[1] = new int[m][2];
p[2] = new int[m][2];
.......
因为是new一个数组,为了理解,可以添加一个数组名称,数组名称必须放在最里面的括号内,并且表示要new的数组大小[..](即此处的[n],不是[2])必须紧随其后,所以int (**p)[2] = new (int(*p1)[2])[n]; int (**p)[2] = new ((int(*p1)[2])[n]); 都不正确。
int (*[n])[2]是含有n个类型为int (*)[2]的数组吗?
可以这样去理解:加上标识符int (*p1[n])[2],根据我那篇转载过来的文章“复杂指针的读法”,从左向右,读到第一个标识符p1,它后面是[],故p1是数组,大小为n,类型呢,去掉分析过的部分就是类型了,为int(*)[]。
同理可写出
int (**p[3])[2];
p[0] = new (int(*[4])[2]);
p[1] = new (int(*[4])[2]);
p[2] = new (int(*[4])[2]);
p[0][0] = new int[5][2];
p[0][1] = new int[5][2];
p[0][2] = new int[5][2];
p[0][3] = new int[5][2];
...........