int (**p)[2]的疑惑

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];

   ...........

 

                   

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值