在今天学习c++多维数组与指针时遇到一些小的问题,再仔细思考之后终于解决疑惑,望我的理解对初学者有一定的帮助。
假设有一个二维的数组a,他有3行和4列,它的定义为int a[3][4]={{1,3,5,7}, {9, 11, 13, 15}, {17, 19, 21, 23}};
C++语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a[0],a[1],a[2]。
每一个一维数组又含有四个元素。例如a[0]数组,含有a[0][0],a[0][1],a[0][2],a[0][3]四个元素。
在此之前我们应该了解,数组名代表数组首元素的地址,所以在二维数组中,a=a[0];现在a[0]不是一个整形变量,
而是由四个整形元素组成的一维数组,因此a代表的是首行的起始地址(即第0行的起始地址,&a[0],a[0]+1代表a[1]
行的首地址,即&a[1]).
a[0], a[1], a[2]既然是一位数组名,而c++又规定了数组名代表数组首元素的地址,因此a[0]+1代表一位数组a[0]中0列
元素的首地址,即&a[0][0].其他的依次类推。那如果用地址法怎么来表示呢?既然a[0]+1是a[0][1]的值,那么*(a[0]+1)
就是a[0][1]元素的值。而a[0]又是和*(a+0)无条件等价的,因此也可以用*(*(a+0)+1)表示a[0][1]元素的值,以此类推,
*(a[i]+j)或*(*(a+i)+j)是a[i][j]的值。以下是我要讲的重点:
那*(a+0)表是什么呢?其实*(a+0)表示a[0]这一行当中的四个元素,我们定义二维数组的指针是这么定义的,假设定义一个
指向a[3][4]数组的指针,int (*p)[4]。这表示什么呢,表示一个一位数组当中的四个指针,因此我们能知道*(a+0)就是取出的
a[0]这一行四个的数据,再由一位数组的取数据推理即可得到二维数组当中自己想取得的值。
总结的一个知识点就是:*(a+0)表示a[0]这一行当中的四个元素,是由定义指向二维数组的指针所得,即int (*p)[4]。