引入
前面我们知道,指针可以指向一维数组中的元素,同样的,指针也可以指向多维数组。这个概念比较绕,要清楚不同层的地址,以及不同的*号所指向的值,以及灵活运用数组名即首元素地址这一概念。
还记得多维数组吗?
之前我们引入过多为数组的概念,很像行列式,例如:
1 | int a[2][3]={{1,2,3},{4,5,6}} |
上面的 a 是数组名
a 数组包含2个行元素
:a[0] 和 a[1]。
上面的每一个行元素又都是一个一维数组
每一个行元素又包含3个列元素
:a[0][0] 、a[0][1] 和 a[0][2]
我们可以理解为,二维数组
是数组的数组
,上面这个二维数组是由 2 个一维数组组成的,a[0] 和 a[1] 就是这两个一维数组的数组名。
多维数组的地址
我们回顾了多维数组后,我们再从指针的角度来分析一下多维数组的地址:
1 | int a[2][3]={{1,2,3},{4,5,6}} |
我们还是拿它来举例:
首先是多维数组名代表0行首地址:
a 是 0 行的首地址,也是 a[0]的地址,也是 a[0][0]的地址;
然后是两个行元素的首地址:
a+0 是 a[0] 的首地址;
a+1 是 a[1] 的首地址;
同时,a[0] 和 a[1] 的首地址也是其数组第一个元素地址:
a+0=a[0]=a[0][0] 的元素地址
a+1=a[1]=a[1][0] 的元素地址
以上转换的都是地址,运用的是数组名代表首元素的地址,只不过套用了两次。我们再看*号转换。
a 是 a[0] 的首地址,a[0]也是 a[0][0]的首地址,所以a 是 a[0] 和 a[0][0]的首地址。
将地址转换成元素值
a 是 ( a ), a 是a[0]的首地址,a[0]=a[0][0]的地址,所以 a[0][0]的地址,也就是a[0][0]的值,即 a=a[0][0]。
移动位置
(a+1) 表示的是 a=a[0] 的首地址向后一位,结果也就是 a[1]=a[1][0] 的地址。如果我们再加一个号将其转换为元素,也就是 *(a+1)=a[1][0] 对应的元素值。 (a+1)+1 表示的是,a=a[0] 的首地址,a[0]地址+1也就是 a[1],a[1]的地址+1表示的是 a[1][1]的地址。
例题
1 |
|
不严谨的理解可以是:
1、二维数组,*一次可以得到下一层的地址,下一层的地址表示的是该行元素的首元素。
2、在行元素+1和在列元素+1是不同的,我们可以利用指针控制不同的行元素,也可以控制不同的列元素。
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。