0.二维数组特性
①.存储格式
二维数组,在存储空间内的存储顺序是连续存储,按行优先存。
假设定义一个2X3的数组,其在存储空间的存储格式如下:
②.表示方法
且二维数组还有一个特性,例如有二维数组 a[3][2] ,那么 a[0] 就代表第一行 a[0][0] 的地址,a[1] 就代表第二行 a[1][0] 的地址。
既然知道了每行数组的首地址是 a[0] 、a[1] 、a[2],那么表示每一行的后面几个元素就再加一个偏移量。a[0] 表示第一行首个元素的地址,那么在首个地址上加一个偏移量 a[0][1] ,就代表了那一行的后面的元素。
注:a[0] 、 a[1] 、a[2] 表示该行元素的首地址,是一个一级指针
③.数组名的含义
前面说到了,若定义了一个二维数组 int a[3][2] ; 其中 a[0] (即(a + 0))代表第一行的首地址,a[1] (即(a + 1))代表第二行的首地址,a[2]((a + 2)) 代表第三行的首地址;
可见,对于二维数组来说,a 代表的是该数组的首地址(又称:行指针),其步长为 一行 !
一.用一阶指针表示二维数组
若定义一个一阶指针,指向数组 a[3][2] ,则该一阶指针是这么表示二维数组的:
其指针 p 的步长为 4个字节 :(int)类型的大小。
可见,一阶指针和二阶指针的步长是不一样的!
三.行指针(数组指针)
1.行指针定义
定义一个指针,使其指向一个二维数组。
int (*p)[3] ,其中的 [3] 表示该指针的步长为 3 个 int (一行),则 p 的类型为 int (*)[3]
/* 二维数组 */
int a[2][3];
/* 行指针、其中 [3] 代表该指针的步长为(三个int) */
int (*p)[3];
/* 使 p 指向数组 a */
p = a;
2.使用行指针表示数组元素
①.行指针偏移量 - a[][]
a[1] 表示第二行 ,在加一个偏移量 [1] 表示第二行的第二个数据。
int a[3][2] = {{1,6},{9,12},{61,12}};
int (*p)[2];
p = a;
printf("a[1][1]:%d\n",a[1][1]);
printf("a[1][1]:%d\n",p[1][1]);
②.行指针降阶 - *(*(a + 1) + 1)
(1)首先 (a + 1) 表示该二维数组的第二行,在 a 这个二阶指针上 + 1 ,步长为(一行)
(2)*(a + 1) 表示将该地址降阶为了一阶指针(二阶指针解引用,变为一阶指针)
(3)*(a + 1) + 1 表示该一阶指针移动一个步长(int),对应了 a[1][1] 的地址
(4)*(*(a + 1) + 1) 最后将该元素的地址进行解引用,得到数据
int a[3][2] = {{1,6},{9,12},{61,12}};
int (*p)[2];
p = a;
printf("a[1][1]:%d\n",*(*(a + 1) + 1));
printf("a[1][1]:%d\n",*(*(p + 1) + 1));