一些关于数组和指针的想法

指针是C的难点和精华,当他和数组相遇时,如果没有好好理清它们之间的关系和原理,那真是搞不清理还乱了。

1:二维数组a代表什么含义?


首先定义了一个二维数组a,当然我们必须把a看成一个一维数组,它有两个“大”(行)元素,每个“大”(行)元素都由五个“小”(列)元素,这是我们理解数组的前提条件。

a是一个数组,它的数组名a代表了其首元素的地址,这里就是第一行的地址,它的类型是什么呢?答:指向由int小元素组成的行元素。所以类型是int (*)[5]型。

第七行定义了一个int(*)[5]类型的指针ptr,它指向a的第一行,

(ptr+1)指向第二行,

*(ptr+1)代表了第二行的首元素的地址,

*(ptr+1)+4代表了第二行第五个元素的地址,所以最后输出了第二行第五列的元素。

ptr指向a的第一行,a代表的含义也是指向a数组的第一行,那么其实ptr=a,都是指针的指针,都是二维指针。

2:&a又是什么意思?

我们首先直接在第七行改动一下:


编译肯定是不通过的,报错如下:


虽然错了,但是通过这条信息我们知道了这个关键信息:&a的类型:int(*)[2][5]。

在这里,a不仅仅是一个二维数组,我们更应当把它看成一个对象,那么对对象a取地址就是在考察对象a是什么类型的。

先把第七行修改正确:


那么这里ptr就是一个指向对象a的指针,这里的a恰好是一个二维数组。

此时ptr+1是啥意思?

这里的+1,指针跨度就比之前大多了,因为现在是以对象为单位了,跨度是2*5=10个int型数据。

那是什么东西?没人知道是什么东西。

其实a=&a,虽然含义不同,我们可以将&a强制转化为int *类型,也就是让它直接指向首行首元素,那么:


符合预期。

1中指明了a其实是二维指针,那么&a就是三维指针了,如下:



果然。

未完待续,不定时更新。。。

猜你喜欢

转载自blog.csdn.net/qq_30483585/article/details/80322668