二维数组可以看成由几个一维数组作为元素组成的一维数组。
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
它是由3个数组元素(a[ 0 ],a[ 1 ],a[ 2 ])组成,每个元素都是一个一维数组。
数组名a代表数组的首地址,二维数组名x代表是一个行地址。
a代表的是a[ 0 ] ;
x[ 0 ],x[ 1 ],x[ 2 ]为一维数组名的行地址
即(x+0) 代表的是x[ 0 ]的首地址, (x+1)代表的是x[ 1 ]的首地址, (x+2)代表的是x[ 2 ]的首地址
如果a是一维数组名,a[ i ]是a数组中的一个元素,那么a[ i ]等价于*(a+i);
同样,将二维数组a看作是一个一维数组,a是数组名,a[ i ]为a数组的一个元素,,那么a[ i ]等价于*(a+i)。============a[ i ]=*(a+i)
所以,二维数组a中的元素a[ i ]a[ j ]的地址(或指针)既可以用a[ i ]+j来表示,也可以用*(a+i)+j表示 =============a[ i ]a[ j ]=*(a[ i ]+j)=*(*(a+i)+j)
=========================================================================
有意思的思考
在二维数组里面,a+1和*(a+1)他们都是代表着同一个地址,这是因为二维数组里面,a代表的是0行的首地址, a+1就是第2行的首地址,那么*(a+1), 根据上面的等价关系, 我们可以知道*(a+1)==a[ 1 ],在二维数组里面也是表达第2行的首地址,所以是一样的。
=========================================================================
表示形式 | 含义 | 地址 |
a | 二维数组名,指向一维数组a[0],即0行的首地址 | 2000 |
a[0],*(a+0),*a | 0行0列元素地址 | 2000 |
a+1,&a[1] | 1行首地址 | 2016 |
a[1],*(a+1) | 1行0列元素a[1][0]的地址 | 2016 |
a[1]+2,*(a+1)+2,&a[1][2] | 1行2列元素a[1][2]的地址 | 2024 |
*(a[1]+2),*(*(a+1)+2),a[1][2] | 1行2列元素a[1][2]的值 | 元素值为13 |