指针和二维数组的关系要点简单分析

现有二维数组 int a[2][3] = {1,2,3,4,5,6}; 现在想要声明一个指针指向二维数组,该怎么声明呢?

首先,指针保存的是一个地址,并且这个地址是带有类型的地址。其次,声明的指针要指向谁呢?

1.指向 a.即:指向二维数组的首元素地址。因为二维数组本质上是一个一维数组。

     a .可以这样理解:int a[2][3]  这个二维数组包含2个元素,a[0],a[1]   而a[0]又是一个一维数组包含的元素为{1,2,3}.

    还可以这样理解:int a[2][3]  这个二维数组包含2个元素,a[0],a[1] 可以看做是外层一维数组的两个元素,a可以看做外层一维数组的数组名。

    而a[0]又是一个一维数组包含的元素为{1,2,3}可以看做是里层一维数组,a[0]可以看做里层一维数组{1,2,3}的数组名,a[1]可以看做里层一维数组{4,5,6}的数组名

  b.a[0] 它的数据类型是什么样的呢? 因为a[0] 包含{1,2,3} 这3个元素,而每个元素都是int类型,那么a[0] 的类型为:int[3] 类型.

  c.有了以上的理解作为基础。那么指向a,即:指向二维数组的首元素 a[0] ,而首元素又是一个数组,所以应该声明一个指向数组的指针 :int (*p)[3];

2,指向二维数组中,里层一维数组的元素。

 a.a代表外层一维数组{a[0],a[1]}首元素的地址。即:a[0]的地址:&a[0].

 b.a[0]代表里层一维数组{1,2,3}首元素的地址。即:元素 1 的地址:&a[0][0]。

 c.由以上两点可以看出:1.对a[0]进行 & 操作 就变成外层一维数组的首元素地址了(&a[0]),即:升级维度了,变成二维的了。

            2.对&a[0]进行 * 操作就变成里层一维数组的首元素地址了(a[0]),即:降低维度了。变成一维数组了。

 d.既然指向 a 需要 声明 int(*p)[3];这样的数组指针,p = a;  也就是p = &a[0](二维数组首元素地址)  那么*p = a[0] (降低维度变成一维,即:一维数组首元素地址),**p = 1(继续降低维度       变成0维度,即:没有维度,就是元素本身了)。

猜你喜欢

转载自www.cnblogs.com/wangchaomahan/p/9499823.html