日映岚光青锁翠———二维数组

我们知道二维数组一般是这样定义的:

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

若是还不明白,我们从中单独摘出一行来看:


现在把有关二维数组的关系剔除,我们就看这一行,再给它起个新名字叫 brr

brr 是个一维数组,我们就可以这样定义它:

int brr[4] = {5,6,7,8};

所以

brr[0] = 5

brr[1] = 6

brr[2] = 7

brr[3] = 8

现在再回过头来看,因为brr = arr[1];现在替换一下

那么 arr[1][2] = 7 顺理成章。

也就是说,二维数组的每一行我们都可看作一个一维数组,则二维数组arr由三个一维数组组成:arr[0]arr[1]arr[2]

既然这是三个一维数组,其数组名所指向的就是其首元素的地址。

arr[0] 的首元素是1,在二维数组中的位置是00列,

所以 arr[0] 代表 00列元素的地址。

arr[1] 的首元素是5,在二维数组中的位置是10列,

所以 arr[1] 代表 10列元素的地址。

arr[2] 的首元素是9,在二维数组中的位置是20列,

所以 arr[2] 代表 20列元素的地址。

接下来,进入下一个问题,二维数组的数组名代表着什么?

我们知道,一维数组的数组名代表的是其首元素的地址,那么我们推测二维数组的数组名也代表着其首元素的地址?这样的推测是绝对没错的,但是现在二维数组的首元素不是单纯的的一个整型元素了,而是由四个整型元素所组成的一维数组。也就是说:二维数组名代表的是首行的首地址。

 

既然 arr 0行的首地址,那么arr+1就代表着1行的首地址,同理arr+2 代表的是 2行的首地址。

以下的这个程序虽然输出的值都是相同的,但却有着各自的含义,需要读者仔细琢磨其概念。


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页。
阅读更多
上一篇鸿雁长飞光不度——字符串常量与字符数组
下一篇铁马冰河入梦来——程序运行过程分析(待补充)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭