C语言中的指针-指针引用多维数组-学习笔记-29

引入

前面我们知道,指针可以指向一维数组中的元素,同样的,指针也可以指向多维数组。这个概念比较绕,要清楚不同层的地址,以及不同的*号所指向的值,以及灵活运用数组名即首元素地址这一概念。

还记得多维数组吗?

之前我们引入过多为数组的概念,很像行列式,例如:

1
2
int a[2][3]={{1,2,3},{4,5,6}}
//这就是一个简单的二维数组,2行3列

上面的 a 是数组名
a 数组包含2个行元素:a[0] 和 a[1]。
上面的每一个行元素又都是一个一维数组
每一个行元素又包含3个列元素:a[0][0] 、a[0][1] 和 a[0][2]

我们可以理解为,二维数组是数组的数组,上面这个二维数组是由 2 个一维数组组成的,a[0] 和 a[1] 就是这两个一维数组的数组名。

多维数组的地址

我们回顾了多维数组后,我们再从指针的角度来分析一下多维数组的地址:

1
2
int a[2][3]={{1,2,3},{4,5,6}}
//这就是一个简单的二维数组,2行3列

我们还是拿它来举例:
首先是多维数组名代表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
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main(){
int a[2][3]={{1,2,3},{4,5,6}};
printf("a[0][0],**a:%d,%d\n",a[0][0],**a);
//&a[0][0]=&a[0]=a
printf("*a[0],a[0][0]:%d,%d\n",*a[0],a[0][0]);
//a[0]=&a[0][0],即*a[0]=a[0][0]
printf("**(a+1),a[1][0]:%d,%d\n",**(a+1),a[1][0]);
//a+1移动指针,第一个星号获取地址,第二个星号,获取首元素
printf("*(*(a+1)+1),a[1][1]:%d,%d\n",*(*(a+1)+1),a[1][1]);
// a+1移动行元素指针,*号获取行元素地址,地址+1,移动列元素指针,*号获取该地址的元素值。
}

不严谨的理解可以是:
1、二维数组,*一次可以得到下一层的地址,下一层的地址表示的是该行元素的首元素。
2、在行元素+1和在列元素+1是不同的,我们可以利用指针控制不同的行元素,也可以控制不同的列元素。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!