数组指针
首先,我们先介绍一下二维数组 和 二维数组的指针,二维数组相当于一个特殊的一维数组里面每个元素又是一个一维数组,例如:int a[3][3],可以看成一个3行的一个列数组,每一列的元素又是一个长度为3的数组,数组名的一个特殊一维数组的首地址,如下:
a(第0行的首地址,也是可以是 &a[0])指向 a[0],对0行首地址元素的引用就有 *a = a[0];
- a+1(第一行的首地址)指向a[1],有 *(a+1) = a[1];
- a+2(第二行的首地址)指向a[2],有 *(a+2) = a[2];
- a+i(第i行的首地址)指向一个[i]中,有 *(a+1) = a[i] 中;
而 a[0], a[1], a[2] 又是里面一维数组的数组名,因此 a[i] 可表示 i 行的首地址:
- a[0](第0行第0个元素的地址)指向一个 a[0][0],有 *(a[0]+0) = a[0][0];
- a[0] + 1(第0行第1个元素的地址)指向 a[0][1],有 *(a[0]+1) = a[0][1];
- a[0] + 2(第0行第2个元素的地址)指向 a[0][2],有 *(a[0]+2) = a[0][2];
总结:a[i]+j(第i行第j列个元素的地址)指向 a[i][j],有 *(a[i]+j) = a[i][j],即 *(*(a+i)+j) = a[i][j]
二维数组的指针变量
对于指向二维数组的指针变量p,可以有两种:
- 一种是指向数组元素的列指针;
- 一种是指向行的行指针,这时,p不是指向一个具体的数组元素,而是指向一个包含m个元素的一维数组。
这里对行指针特殊说明一下:
行指针的定义形式为:类型标识符 (*指针变量名)[长度]
例如:
int a[3][4], (*p)[4] = a; // 这里也可以写成 int a[3][4], (*p)[4] = &a[0];
其中 p,p+1,p+2 和 a,a+1,a+2 都是第i行的首地址。
使用指针变量访问二维数组的任意一个元素的方法
(1)使用列指针:定义一个列指针p,让它指向二维数组的第0个元素
int a[3][4]; int *p; p = &a[0][0]; // 因为a[0]是第0行的数组名,所以 p = &a[0][0] 相当于 p = a[0],因为 a[i][j] 前面共有 i*4+j 个元素,该二维数组的任意i行j列元素可表示为 *(p+i*4+j)
(2)使用行指针:定义一个行指针p,让它指向二维数组的第0行
int a[3][4]; int (*p)[4]; p = a; // 也可以写成 p=&a[0];
其中 *(*(p+i)+j) 表示任意一个i行j列 的元素。
摘自:https://blog.csdn.net/qq_36744540/article/details/79832728