日映岚光青锁翠———二维数组
我们知道二维数组一般是这样定义的:
int arr[3][4] = {{1,2,3,4},{5,6,7,8,},{9,10,11,12}};
当然也可以这样定义
int arr[][4] ={{1,2,3,4},{5,6,7,8},{9,10,11,12}}
int arr[][4] ={1,2,3,4,5,6,7,8,9,10,11,12}
我们可以省略行号不写,因为系统可以根据每行的元素的个数,来判断总共有多少行。(注意:我们可以省略第一维的长度,但第二维的长度一定要指定,arr[3][]和arr[][]这两种都是错误的。)
这个数组打印出来的是三行四列的形式,如:
1 2 3 4
5 6 7 8
9 10 11 12
我们可以把二维数组当成特殊的一维数组来看,如下图:
我们把二维数组arr当做是由三个一维数组组成的,每个一维数组的长度为4,如:arr[1][2],arr[1]当做一维数组名来看待,那么arr[1][2]的意思就是一维数组arr[1]中的第三个元素,也就是7。
若是还不明白,我们从中单独摘出一行来看:
int brr[4] = {5,6,7,8};
所以
brr[0] = 5;
brr[1] = 6;
brr[2] = 7;
现在再回过头来看,因为brr = arr[1];现在替换一下
arr[0] 的首元素是1,在二维数组中的位置是0行0列,
arr[1] 的首元素是5,在二维数组中的位置是1行0列,
arr[2] 的首元素是9,在二维数组中的位置是2行0列,
我们知道,一维数组的数组名代表的是其首元素的地址,那么我们推测二维数组的数组名也代表着其首元素的地址?这样的推测是绝对没错的,但是现在二维数组的首元素不是单纯的的一个整型元素了,而是由四个整型元素所组成的一维数组。也就是说:二维数组名代表的是首行的首地址。
int main()
{
int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
printf("%d\n",arr[1]); //1行0列元素地址
printf("%d\n",&arr[1]); //1行首地址
printf("%d\n",&arr[1][0]); //1行0列元素地址
printf("%d\n",arr+1); //1行首地址
printf("%d\n",*(arr+1)); //1行0列元素地址,arr[1]等价于*(arr+1)
printf("%d\n",&*(arr+1)); //1行首地址
return 0;
}
个人言辞匮乏,难免有词不达意之处,若还不理解,请参考 谭浩强《C程序设计(第四版)》245页~248页。推荐阅读