对于数组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]相同)。