嵌入式-C语言基础:二维数组
二维数组的每个元素都是一个一维数组,例如int arr[2][3]={{1,2,3},{4,5,6}};
下面通过几个例子来对二维数组进行深入了解:二维数组可以看作是一个父数组,他的每个元素都是一个一维的子数组。
(1)数组名表示数组首元素的地址,那么arr表示的是谁的地址?arr表示的是ar首元素的地址,也就是arr[0]的地址,同样arr[0],arr[1]也是两个子元素一维数组的数组名,可以分别用数组名a,b来代替,那么arr[0][0]表示a[0],ar[1][0]表示b[0],所以a(arr[0]),b(arr[1])作为数组名f分别也是a[0]和b[0]的地址,也就是arr[0][0]和arr[0][1]的地址:
#include<stdio.h> int main() { int arr[2][3]={{1,2,3},{4,5,6}}; printf("arr表示的是arr的首元素地址:%p\n",arr); printf("*(arr+0)表示的是arr的首元素地址:%p\n",*(arr+0));//arr表示的是arr的首元素arr[0]的地址,那么*(arr+0)表示的就是arr[0],arr[0]表示arr[0][0]的地址 printf("&arr[0][0]表示的是arr[0][0]的首元素地址:%p\n",&arr[0][0]); printf("&arr[0]表示的是arr的首元素地址:%p\n",&arr[0]); printf("arr[0]表示的是arr[0]这个子一维数组的首元素地址:%p\n",arr[0]); printf("arr[1]表示的是arr[1]这个子一维数组arr[1]的首元素地址:%p\n",arr[1]); printf("&arr[1][0]表示的是arr[1]这个子一维数组arr[1]的首元素地址:%p\n",&arr[1][0]); printf("arr[1]表示的是arr[1]这个子一维数组arr[1]的首元素地址:%p\n",arr[1]); printf("*(arr+1)+0表示的是arr[1]这个子一维数组arr[1]的首元素地址:%p,偏移1后:%p\n\n",*(arr+1)+0,*(arr+1)+1);//偏移到arr[1]下一个元素的地址 return 0; }
输出结果
arr表示的是arr的首元素地址:000000000061FE00
*(arr+0)表示的是arr的首元素地址:000000000061FE00
&arr[0][0]表示的是arr[0][0]的首元素地址:000000000061FE00
&arr[0]表示的是arr的首元素地址:000000000061FE00
arr[0]表示的是arr[0]这个子一维数组的首元素地址:000000000061FE00
arr[1]表示的是arr[1]这个子一维数组arr[1]的首元素地址:000000000061FE0C
&arr[1][0]表示的是arr[1]这个子一维数组arr[1]的首元素地址:000000000061FE0C
arr[1]表示的是arr[1]这个子一维数组arr[1]的首元素地址:000000000061FE0C
*(arr+1)+0表示的是arr[1]这个子一维数组arr[1]的首元素地址:000000000061FE0C,偏移1后:000000000061FE10
总结:*(p+i)+j和a[i][j]是等价的,数组名可以当作指针来用,表示地址
二维数组地址写法:
二维数组a的有关指针:
表示形式 含义 地址
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]的值