[关闭]
@CrazyHenry 2018-01-23T13:13:44.000000Z 字数 949 阅读 1214

3.x 指针与多维数组

ccccC++Primer


我们以二维数组为例来讨论这个问题:

一般如果有人说,二维数组名是指针的指针,我认为这个人是自己研究过的,但是研究的不够专业。

实际上,数组就是数组,指针就是指针,有时候(其实大多时候都是)数组名确实会转换为指针。但是,这个指针的类型,就需要和数组联系起来理解了,而不是单纯就是个指针而已。而那些将(二维)数组名理解成指针的指针,就往往会在类型上出错,即便对某些内存上的理解是正确的。

3种方式访问二维数组

1.

  1. int main()
  2. {
  3. int ia[3][4];
  4. for(auto p = ia; p != ia + 3; p++)
  5. for(auto q = *p; q != *p + 4; q++)
  6. cout<<*q<<endl;
  7. return 0;
  8. }

先分析第一句:for(auto p = ia; p != ia + 3; p++)
ia的类型是二维数组,但是在赋值语句会转换为指向内层数组的指针:int (*)[4]类型的指针,所以auto应该是int (*)[4].

ia + 3,ia也会转换为int (*)[4],而且,这里一步+1就是增加int[4]的距离,因此就在外层数组上步进,所以说,指针的类型和数组是紧密相连的!

再来看第二句:for(auto q = *p; q != *p + 4; q++)
对p这种类型为int (*)[4]的指针解引用,那么就会得到一个类型为指针所指对象的对象,所以*p的类型就是int[4],也就是一个一维的数组名,一维数组名在赋值语句会转换为一个指针,指向数组的第一个元素。那么q的类型实际上就是int*,再看(*p + 4),*p仍然会转换为指针int*型,这里的步进就是一个int型啦!q的类型自然是int*,对q解引用自然就是int型的整数对象啦!

2.

image_1buiou6c7qmm1g1ve741vmr1ehd9.png-62kB

从这种方法,我们更能看出来,虽然p和q都是指针(地址),但是由于其所指的对象不同,所以指针的类型也是不一样的。即便这个指针所存的地址可能是相同的值。

3.

image_1buiovn6il0hi801ese1hc71vcqm.png-56.4kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注