一维数组名和二维数组名都可以看做是指针,不同在于:
(1)一维数组名相当于指向该数组数据类型的指针;
(2)二维数组名相当于指向该数组中的一维数组的数组指针。
比如,定义一维数组 int a[i] 和二维数组 int b[i][j],a相当于int (*),而b相当于int (*)[j]。
因此,想要获得 a[i] 中第 x 个元素,可以直接使用 *(a+x)。而想要获得 b[i][j] 中第 x 行第 y 个元素,则需用 *(*(b+x)+y),因为 b 相当于数组指针,(b+x) 则是指向第 x 个数组的指针,注意,是指向数组,而不是数组元素!所以 *(b+x) 获得的是第 x 个数组的数组名,即该数组的首元素地址,这时再结合偏移量 y 就可以取得该元素。
可以这样来记忆:
..[n] 编译后其实等价于 *(..+n) ,因此,a[x] = *(a+x),b[x] = *(b+x),b[x][y] = *(*(b+x)+y)