二维数组指针

我们知道定义一个一维数组int a[10],a代表什么?a代表一维数组a中第一个元素的首地址,所以*a是a[0]的值,可以试试。
而定义一个二维数据int a[10][5],a代表什么?a同样代表二维数据a中第一个元素的首地址,但不同的是这个第一个元素是a[0]同样是一个数组,所以*a不会返回a[0][0]的值,因为它不代表a[0][0]的地址。那它返回的是什么呢?既然在二维数组中,a代表a[0]这个数组的地址,那么*a就应该是a[0]的值,可是a[0]是个数组,它的值是不能整体访问的,所以只能返回这个数组首元素的首地址,也就是a[0][0]的地址,所以a[i][j]可以换
算成以指针的形式表示:*(*(a+i)+j)。
来分析一下这个表示*(*(a+i)+j)。其中a代表第一个元素(是个数组a[0])的地址,这个时候地址偏移以这个地址所代表的类型进行偏移,每移动1个位置,偏移40字节。那么(a+i)就是第i行元素的地址。而按照上面的分析*(a+i)即是第i行第一个元素的首地址,这个时候地址偏移以这个地址所代表的类型进行偏移,每移动1个位置,偏移4字节。
可以调试一下看看,定义一个二维数组上面说过*a代表是第一个元素(这个元素仍是个数组),*a 的类型是数组类型,可以试试(*a)[0],(*a)[1]...代码都是正确的,那么**a=a[0][0]。那么a和a+i的类型是什么呢?a+i是第i行元素(是个数组)的地址,那么他应该是应该是个指向这个一维数组的指针,是int (*)[]类型的。a呢?按理说也应该是int (*)[],因为a是第一行元素的地址,可是我们定义了a是int[][]类型,a同时也代表了整个二维数组,所以会是int[][]类型。

posted on 2015-08-26 15:43  jianqi2010  阅读(214)  评论(0编辑  收藏  举报

导航