指针表示数组的几种方式 您所在的位置:网站首页 第二可以怎么表达 指针表示数组的几种方式

指针表示数组的几种方式

2024-07-06 11:01| 来源: 网络整理| 查看: 265

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 定义指针表示二维数组,以下为纠正后的表示:

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有