指针与数组

指针与一维数组

数组的名称就代表该数组的首地址,因此数组的名称就是指针常量。

例如:inta[5] = {1,2,3,4,5}

Int * ptr=a;

这里ptr就相当于a,只不过ptr是一个指针变量,而a只是一个指针常量。因此ptr[i]就相当于a[i],ptr+i就相当于&a[i]。*(ptr+i)相当于a[i]

Ptr+i表示的是将当前指针变量的地址加一,也就是下一物理内存的地址。

取一位数组中的元素的几种方式:

a[i]、*(a+i)(a是一个指针常量)、*(ptr+i)、ptr[i]。

指针与二维数组

数组的名称就代表该数组的首地址,因此数组的名称就是指针常量。

可以把二维数组想象成由两个一位数组组成的一个表格:

a[i]      a[j]

a[0]

a[1]

a[2]

a[3]

a[j]

a[0]

 

 

 

 

 

a[i]

 

 

 

 

 

因此我们要向得到二维数组中的元素,应该包含两个[]或者是两个*或者是一个*和一个[],除此之外得到的都是地址。形如以下二维数组:

Int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}

int *p = a;

a+i和a[0]+i的区别

a相当于a[0][0],但是a和a[0]加1代表的含义是不同的。a[0]+1代表的是a[0][1],而a+1则代表的是a[1][0],相当于a由于行还未确定,因此当对a进行操作的时候,将对行优先操作。而a[0]+1则由于当前的a[0]代表第一行的首地址,相当于行已经确定,则会对当前行所在的列进行操作,也就是在当前行上增加相应的地址。由于*和[]一共出现两次才能取得正确的元素的值,因此当出现单个*或者[]的时候均表示当前的地址。

*(p+i)和*p+i的区别

*(p+i)和p+i表示的都是第a[i][0]行的地址,而*p则和上面的a[0]+i表示的含义一样,*p表示当前的行地址已经确定,所以在进行*p+i操作时只会在当前行的基础上加上一段内存地址。比如当前的a的首地址为0x00,则a[1]的地址将为oxd(一个整形数据占四个字节),当对a[0]+1时,此时的值为0x00+4=0x4(即为a[0][1]的地址)而对a进行a+1操作时,表示0x00+c(3个int型所占的长度)+1(下一个内存地址)=0xod(a[1][0]的地址)。也就是相当于只有一个*或者是[]的时候只能确定行的地址。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值