1、一维数组
一维数组是顺序排列,以数组a[4]为例 &a代表整个数组的地址,数组名a则代表第一个元素的地址。
2、二维数组
二维数组虽然也是顺序排列,但是因为多了一个维数,所以其地址的增加顺序为先增加列再增加行。
把下列代码参透,你就可以完全掌握二维数组
int main(void) { int i; int a[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12}; int *p = &a[0][0]; for(i=0;i<12;i++) { printf("%d,%p ",*(p+i),p+i); if((i+1)%4 == 0) printf("\n"); } printf("----------------------------\n"); printf("a = %p\n",a); //a是一个行地址,这里代表第一行的首地址 printf("a[0] = %p\n",a[0]); //a[0]是一个行地址与a相同,这里代表第一行的首地址 printf("&a[0] = %p\n",a[0]); //&a[0]是一个行地址与a相同,这里代表第一行的首地址 printf("*a = %p",*a); //*a指向第一个数据的地址 *(a+0)+0 = a[0]+0 printf("&a[0][0] = %p\n",&a[0][0]); //&a[0][0]是第一个元素的地址,这是代表第一个元素的地址 printf("&a = %p\n",&a); //&a是整个数组的地址 printf("----------------------------\n"); printf("*a + 1= %p\n",*a + 1); //*a+1指向第二个数据的地址 等价于*(a+0)+1 *(a+0) = a[0] printf("&a[0][0] + 1 = %p\n",&a[0][0] + 1);//&a[0][0]+1,这里代表第一行第二个元素的地址 printf("a+1 = %p\n",a+1); //a+1,这里代表第二行的首地址 printf("a[1] = %p\n",a[1]); //a[1],这里代表第二行的首地址 printf("&a[1] = %p\n",a[1]); //&a[1]是一个行地址与a相同,这里代表第二行的首地址 printf("&a[0]+1 = %p\n",&a[0]+1); //&a[0]+1,&a[0]因为是个行地址所以加1变成第二行的地址。 printf("a[0]+1 = %p\n",a[0]+1); //a[0]+1,这里代表第一行第二个元素的地址 printf("*a + 1= %p",*a + 1); //*a+1指向第二个数据的地址 等价于*(a+0)+1 *(a+0) = a[0] 同上 printf("&a[0][0] + 1 = %p\n",&a[0][0] + 1);//&a[0][0]+1,这里代表第一行第二个元素的地址 printf("&a + 1 = %p\n",&a + 1); //&a + 1,超过数组范围 printf("----------------------------\n"); //&a[0][0] = a[0]+0 = *(a+0)+0 //解引用 a[0][0] = *(&a[0][0]) = *(a[0]+0) = *(*(a+0)+0) //所以 a[i][j] = *(&a[i][j]) = *(a[i]+j) = *(*(a+i)+j) }
运行结果如下:
<img src="https://img-blog.csdn.net/20161014211927872?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" style="font-family: Arial, Helvetica, sans-serif;" alt="" />