1.二维数组=父数组+子数组
•数组首地址是数组名,也是数组首个元素的地址
例如:int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}};
(1)a是二维数组名,即父数组名,亦数组首个元素地址;
(2)a[0]是一维数组名,即子数组名,亦数组首个元素地址,a[0]与&a[0][0]等价。
(3)a实际是一个行地址,*a为列地址,也就是子数组首地址,即*a与a[0]等价。(因为C语言中没有对整个数组操作的概念,操作的只是数组首地址)
2.编程示例
#include <stdio.h>
int main()
{
int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}};
printf("arr是父数组地址:%p,偏移1后地址是:%p\n",arr,arr+1);//偏移16个字节
printf("arr[0]是子数组地址:%p,偏移1后地址是:%p\n",arr[0],arr[0]+1);//偏移4个字节
printf("arr[0]是子数组地址:%p,偏移1后地址是:%p\n",*(arr+0),*(arr+0)+1);
return 0;
}
#include <stdio.h>
int main()
{
int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}};
int i,j;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("add:0x%p,data:%d \n",&arr[i][j],arr[i][j]);
printf("add:0x%p,data:%d \n",arr[i]+j,*(arr[i]+j));
printf("add:0x%p,data:%d \n",*(arr+i)+j,*(*(arr+i)+j));
printf("==============================================\n");
}
putchar('\n');
}
return 0;
}
3.认知