指针和二维数组(看完就有收获哦)

附有指针p与二维数组a的关系(建议收藏):

(一)、对于int[3][4],*p=a[0];,指针p与二维数组的关系如下(建议收藏):

指针p与二维数组a的关系
地址描述意义数组元素描述意义
a、*a、a[0]、&a[0][0]、pa的首地址**a、*p、*a[0]、a[ 0][0]

a[0][0]的值

*a+1、a[0]+1、&a[0][0]+1、p+1a[0][1]的地址

*(*a+1)、*(p+1)、a[0][1]、*(a[0]+1)、

*(&a[0][0]+1)

a[0][1]的值
a+1a[1][0]的地址**(a+1)、*a[1]、a[1][0]

a[1][0]的值

a+ia[i][0]的地址**(a+i)、*a[ i ]、a[ i ][0]

a[ i ][0]的值

*a+i*4+j、p+i*4+j、a[0]+i*4+j、&a[0][0]+i*4+j、&a[ i ][ j ]a[i][j]的地址*(*a+i*4+j)、*(p+i*4+j)、*(a[0]+i*4+j)、a[ i ][ j ]、*(&a[0][0]+ i*4+j)a[ i ][ j ]的

(二)、分析:

 (1)、设p是指向数组a的指针变量,

              若有:p=a[0];

              则p+j将指向a[0]数组中的元素a[0][j]。

  (2)、由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如:     p+i*N+j

              1.元素a[i][j]相应的用指针表示为:*( p+i*N+j)

              2.同样,a[i][j]也可使用指针下标法表示,如:p[i*N+j]

  (3)、例如,有如下定义:

               int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};

     则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。

若有:int *p=a[0];

则:

  1. 数组a的元素a[1][2]对应的指针为:p+1*4+2
  2. 元素a[1][2]也就可以表示为:*( p+1*4+2)
  3. 用下标表示法,a[1][2]表示为:p[1*4+2]

(三)、特别说明(对指针p与二维数组对照表的分析):

        对上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象含义不同。

        a[0]是一维数组的名字,它指向的是a[0]数组的首元素地址,对其进行“*”运算,得到的是一个数组元素值,即a[0]数组首元素值,因此,*a[0]与a[0][0]是同一个值;

        而a是一个二维数组的名字,它指向的是它所属元素的首元素,它的每一个元素都是一个行数组,因此,它的指针移动单位是“行”,所以a+i指向的是第i个行数组的首地址,如a+1为a[1][0]对应的地址,即指向a[i]。对a进行“*”运算,得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值