1、一维数组及其指针表示:
一般会定义一个指针指向一个数组的首地址,定义完成之后,指针指向的地址和数组的首地址一致。
当需要通过指针表示数组具体值的时候,需要在指针前加上*,表示取该地址所存放的具体值
2、二维数组及其指针表示方式
2.1 定义指针表示二维数组
由于数组元素的地址是连续的,因此指针p连续向后取值即依次指向a[0][0]、a[0][1]、a[1][0]、a[1][1]、a[2][0]、a[2][1],这里6=3*2;
归纳一下,arr[i][j]可以表示为*(p+i*2+j),其中2是每行的元素个数,如:
arr[0][1] >> *(p+0*2+1)=*(p+1)
arr[1][1] >> *(p+1*2+1)=*(p+3)
arr[2][0] >> *(p+2*2+0)=*(p+4)
2.2 定义指针数组表示二维数组
首先,我们必须搞懂二维数组的表示方式,在一维数组(这里指int类型)中,可以把一维数组看成一行数字,二维数组呢?不就是多行数字吗?所以二维数组就是多个一维数组组成的;
比如定义一个二维数组arr[3][2],可以看成三个一位数组arr1[2],arr2[2],arr3[2],每个数组包含两个元素,对应的数组名称分别是arr1=arr[0],arr2=arr[1]和arr3=arr[2],这三个一维数组就是二维数组 arr 的三个元素;
在一位数组中,我们知道数组名称是数组的首元素地址,因此二维数组名称arr其实表示的是其首元素arr[0]的地址:
因此arr + i = & arr [ i ],arr [ i ] = *( & arr [ i ] ) = * ( arr + i )
同理,由于arr[ 0 ],arr[ 1 ]和arr[ 2 ]均是一维数组的名称,因此arr[ 0 ],arr[ 1 ]和arr[ 2 ]均可表示其对应一维数组的首元素地址,也就是arr [ i ] = & (arr[ i ]) [ 0 ] = & arr[ i ] [ 0 ]:
一维数组arr[ 0 ] + j = & arr[ 0 ] [ j ] ,arr[ i ] + j = & arr[ i ] [ j ]
结合上面的式子,arr [ i ] = * ( arr + i )
因此得出:arr[ i ] + j = & arr[ i ] [ j ] = * ( arr + i ) + j
因此& arr[ i ] [ j ] = * ( arr + i ) + j ==> arr[ i ] [ j ] = *( * ( arr + i ) + j )
如果定义一个指针数组(*p)[ 2 ],表示的是先定义一个指针p,且指针p指向的是包含两个元素的一维数组,这和二维数组arr[ i ] [ 2 ]中arr[ i ]表示的含义一致(arr[ i ]表示的是包含两个元素的数组)
于是令p = arr,则arr[ i ] [ j ] = *( * ( p + i ) + j )
这里需要注意的是,如果定义一个指针p(int *p;),直接令p = arr,则无法正常表示二维数组arr中的元素,这里比较一下地址,二维数组arr的首地址为2293280,arr + 2表示的是arr[ 2 ]的地址,为2293296:p2+2指向的地址也是2293296,但是p1+2指向的地址也是2293288,这是为什么呢?
这是因为指针p2是一个指针数组,每一个指针指向的都是一个包含2个元素的数组,因此p2+2指向的地址为229380+2×2×4=2293296,但是p1仅仅是一个普通指针,因此p1+2指向的地址为229380+2×4=2293288。
如果需要定义一个普通指针表示二维数组,则可参考2.1 定义指针表示二维数组,以下为纠正后的表示: