欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-20 10:56:14
...

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

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页。
相关标签: 二维数组