数组地址以及数组地址的地址

今天看了这样一道题,我好好研究了一番。题目如下,问第一行输出为0x28ff20,那后面几行的输出是多少?

第二行是a+1的地址,那么a+1很容易计算出来,由于a的类型为int *,所以a+1 = 0x28ff20 + sizeof(int)=0x28ff24,这一行并不难,比较入门。

那么第三行呢,&a,这个怎么理解呢?&a的类型为int(*)[5],应该为指向整个数组a[5]的指针,即&a与a是相等的,虽说值相等,但是它们指向的内容却不同。a的类型为int *,&a的类型为int(*)[5]。这里,大家再好好理解一下。也可以这样,a的类型为int* ,那么&a的类型为int **。

第四行呢,&a+1应该理解为下一个数组的首地址,即&a+1 = 0x28ff20+sizeof(int)*5 = 0x28ff34。

运行结果如下:

 

有人也许对上面三四行的cout结果还有疑问,不妨我们做一个实验。我们建立一个二维数组a[2][5],由于c/c++的数组均是以行序为主序的,即内存中应该依次存放的是a[0][0]、a[0][1]……a[1][4]。

运行结果如下:

这个时候a的类型是int (*)[5],所以a+1相比于a偏移了sizof(int)*5。我们发现,这个值跟前面求&a+1的偏移量是一致的,我们也就可以理解刚才“下一数组的首地址”这个概念了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值