2017年12月17日15:58:41
题目:定义一个int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}的二维数组
1.含义:数组有3行4列
a[0]=== 1 3 5 7
a[1]=== 9 11 13 15
a[2]=== 17 19 21 23
二维数组a[3][4]是由3个一维数组组成的。
即:a代表a[0]行的首地址。a+1代表a[1]的首地址
如果二维数组首地址为2000,则a+1代表 2000+4*4=2016(因为0行有4个整形数据)
-->a+1=a[1](a+1是a[1]的首地址);a[0]->&a[0][0];a[1]->&a[1][0];a[2]=&a[2][0]
2.思考a数组0行1列元素的地址怎么表示呢?
a[0]+1(1代表一个元素的字节数,即4个字节)如果a[0]地址为2000,a[0]+1=2004->&a[0][1]
即:a[0]+0 a[0]+1 a[0]+2 a[0]+3
&a[0][0] &a[0][1] &a[0][2] &a[0][3]
3.细节汇总
前面已经知道:a[0]=*(a+0);a[1]=*(a+1),a[i] = *(a+i)
所以:a[0]+1=*(a+0)+1=a[0][1],同理:*(*(a+0)+1)=*(*(a+1))=a[0][1]
即:*(a[i]+j)=*(*(a+i)+j)=a[i][j].
务必记住:*(a+i)和a[i]是等价的
4.分析a[i]的性质
a[i]从形式上面来看是a数组中序号为i的元素。
如果a是一维数组名,则a[i]代表a数组序号为i的元素的存储单元。
如果a是一个二维数组,则a[i]是一维数组名,它是一个地址。
eg:a,a+i,a[i]、*(a+i)、*(a+i)+j、a[i]+j都是地址。
而:*(a[i]+j)、 *(*(a+i)+j)是二维数组元素a[i][j]的值
5.表现形式
a 二维数组名,指向一维数组a[0],即0行的首地址 2000
a[0], *(a+0), *a 0行0列元素的地址 2000
a+1, &a[1] 1行元素地址 2016
a[1], *(a+1) 1行0列元素a[1][0]的地址 2016
a[1]+2, *(a+1)+2, &a[1][2] 1行2列元素a[1][2]的地址 2024
*(a[1]+2), *(*(a+1)+2), a[1][2] 1行2列元素a[1][2]的值 元素值:13
注意:*(a+1)并不是a+1单元的内容(值),因为a+1并不是一个存储单元
*(a+1)=a[1],而a[1]是一维数组名,所以是地址。