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

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

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,在二维数组中的位置是0行0列,

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

 

既然 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页。

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

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭