现有二维数组 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维度,即:没有维度,就是元素本身了)。