1.1二维数组地址的概念:
在 C 语言中定义的二维数组实际上是一个一维数组, 这个一维数组的每个成员又是一个一维数
组。 如有下面定义:
int *p, a[3][4];
则可把a 数组看成由 a[0]、 a[1]、 a[2]三个元素组成, 而 a[0]、 a[1]、 a[2]每个元素又分别是由 4 个整型元素组成的一维数组。 可用 a[0][0]、 a[0][1]等来引用 a[0]中的每个元素,可用 a[1][0]、 a[1][1]等来引用 a[1]中的每个元素, 其它依此类推。
表示含义 | 形式 | 地址 |
a | 二维数组名, 数组首地址 | 2000 |
a[0], *(a+0), *a | 第 0 行第 0 列元素地址 | 2000 |
a+1 | 第 1 行首地址 | 2008 |
a[1], *(a+1) | 第 1 行第 0 列元素地址 | 2008 |
a[1]+2, *(a+1)+2, &a[1][2] | 第 1 行第 2 列元素地址 | 2012 |
*(a[1]+2),*(*(a+1)+2),a[1][2] | 第 1 行第 2 列元素的值 | 元素值13 |
#include<stdio.h>
#define FORMAT "%d,%d\n"
int main()
{
int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
printf(FORMAT, a, *a);
printf(FORMAT, a[0], *(a + 0));
printf(FORMAT, &a[0], &a[0][0]);
printf(FORMAT, a[1], a + 1);
printf(FORMAT, &a[1][0], *(a + 1) + 0);
printf(FORMAT, a[2], *(a + 2));
printf(FORMAT, &a[2], a + 2);
printf(FORMAT, a[1][0], *(*(a + 1) + 0));
return 0;
}
代码运行结果:
242940712,242940712
242940712,242940712
242940712,242940712
242940728,242940728
242940728,242940728
242940744,242940744
242940744,242940744
9,9 //只有这一个为元素值,其他都为地址
1.2 通过建立一个行指针来引用二维数组元素
若有以下定义:
int a[3][4],(*ptr)[4];
在这里, 说明符(*ptr)[4]中, 由于一对圆括号的存在,所以*号首先与 ptr 结合,说明 ptr 是一个
指针变量,然后再与说明符[4]结合,说明指针变量 ptr 的基类型是一个包含有四个 int 元素的数组。
在这里,ptr 的基类型与 a 的相同,因此 ptr=a;是合法的赋值语句。 ptr+1 等价于 a+1、 *(ptr+1)等价于a[1]。 当 ptr 指向 a 数组的开头时, 可以通过以下形式来引用 a[i][j]:
(1) *(ptr[i]+j) /* 与*(a[i]+j)对应 */
(2) *(*(ptr+i)+j) /* 与*(*(a+i)+j)对应 */
(3) (*(ptr+i))[j] /* 与(*(a+i))[j]对应 */
(4) ptr[i][j] /* 与 a[i][j]对应 */
在这里, ptr 是一个指针变量, 它的值可变, 而 a 是一个常量。