a+1和&a+1的区别

对于数组int a[5],(a+1)相当于&a[1](这里的a+1中的a是数组名,与指针还是不一样的,只有在作为函数参数时会退化为指针),我们之所以能用下标访问就是因为这个,比如:a[1]=*(&a[1])= * (a+1);这对于多维数组也是适用。

而对于&a+1,其中 &a得到的是个指针,而且是个数组指针,即指向一个包含有5个整数数组的指针;那么对于&a+1,也就是指针+1,指针+1的结果是地址,根据sizeof计算的结果可以知道,A.新地址=A.旧地址+sizeof(A)*step(忘了的可以看这篇博客)。因此,&a+1 = &a + sizeof(a)*1,得到的结果是整个数组后面的那块内存。如下图所示

在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{
    int a[5] = {1,2,3,4,5};//假设a的地址为0
    cout << a << endl;//0
    cout << a + 1 << endl;//4
    cout << &a + 1 << endl;//0+(4*5)=20
    return 0;
}

运行结果如下:

00A3F878
00A3F87C//相差4
00A3F88C//相差20

再来看一下二维数组 int a [5] [4],同样的a+1=&a[1];a的地址等同于a[0][0],而a[1]的地址等同于a[1][0],因此两者相差了a[0][0],a[0][1],a[0][2],a[0][4]4个数,地址上相差4*4=16字节。

对于&a+1,同样&a是一个数组指针,而且是一个二维的数组指针,此时的sizeof(a)=4*(4*5)=80,即地址上相差80。
如图所示在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{
     int a[5][4];//假设a的地址为0
    cout << a << endl;//0
    cout <<a + 1<< endl;//16
    cout <<&a + 1 << endl;//80
    cout << &a[2] + 1 << endl;//48
    return 0;
}

结果如下

004FFB98
004FFBA8//相差16
004FFBE8//相差80
004FFBC8//相差48

综上所述,a+1得到的结果就是a[1],而&a+1得到的结果就是跨过整个a(主要看a代表什么),后面的第一个地址。

再比如第二个例子中,对于&a[2]+1,由于a是一个二维数组,所以a[2]是一个一维数组,所以&a[2]也表示一个数组指针,那么&a[2]+1,表示的是跨过整个a[2],后面的第一个地址(地址上与a[3]相同)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值