一、用数组名访问二维数组
1.用数组名访问二维数组
定义二维数组:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}
图形:
1 2 3 4
5 6 7 8
9 10 11 12
因为二维数组是特殊的一维数组,所以
特殊的一维数组形式为 :
int a[3]={第一行a1,第二行a2,第三行3}
因为要用数组名a来访问二维数组,这就相当于用数组名a来访问特殊的一维数组。所以我们先把它当做是一个一维数组来考虑。
下图为数组a在内存中存储情况:
假设我们把这个二维数组看成是一维数组,那么根据普通的一维数组,我们知道,数组名代表一维数组的地址,所以:
数组名a是这个特殊的一维数组的地址,也就说数组的第一行地址为a
a+0 是 数组的第一行地址
a+1 是 数组的第二行地址
a+2 是 数组的第三行地址
由这个我们有可以得出一下结论:
*(a+0)表示取a+0地址中的内容也就是数组第一行地址中的内容
*(a+0)=第一行a1
*(a+1)表示取a+1地址中的内容也就是数组第一行地址中的内容
*(a+1)=第二行a2
*(a+2)表示取a+0地址中的内容也就是数组第一行地址中的内容
*(a+2)=第三行a2
因为我们这是一个二维数组,所以“第一行a1”、“第二行a2”、“第三行a3”也分别代表一个一维数组。所以“第一行a1”也是数组(1,2,3,4)的地址。
所以:
*(第一行a1)表示是数组(1,2,3,4)的值 1
所以:
1=*(第一行a1)=*(*(a+0))
同理:
5=*(第二行a2)=*(*(a+1))
9=*(第三行a3)=*(*(a+2))
从这个规律发现,用数组名可以访问到二维数组每行的首个元素的值。
因为“第一行a1”是一个地址,为了方便我们观察我们用p来代替“第一行a1”
由上图可以清楚的看到,如果我们想要访问元素2,那么该怎么办?
关于数组(1,2,3,4)的地址我们在上面已经知道是“第一行a2”也就是现在的p,所以:
*p 表示的是取地址为p中内容,所以*p=1;
*(p+1) 表示的是取地址为p+1中的内容,所以*(p+1)=2
*(p+2) 表示的是取地址为p+2中的内容,所以*(p+2)=3
*(p+3) 表示的是取地址为p+3中的内容,所以*(p+3)=4
经过这样的代替,应该很好理解我们改怎样访问元素 2,现在我们开始用倒推的方式来推导出如何用数组名来访问二维数组的每一个元素。
例:用二维数组名来访问 元素 2
因为: *(p+1)=2
又因为 p=第一行a1
所以:*('第一行a1'+1)=2
而又因为:'第一行a1'=*(a+0)=*a
所以: *(*a+1)=2
所以这样就可以实现用二维数组名来访问二维数组中的每一个元素。但是我们用的时候不可能是用倒推法,所以我们要总结一下规律:
|
|