指针引用多维数组

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]是一维数组名,所以是地址。

 

posted @ 2017-12-17 20:32  Howie_Tang  阅读(677)  评论(0编辑  收藏  举报