&a + 1和 &(a+1)
问题来源:
int a[5] = {1,2,3,4,5};
int *b = (int *)(&a+1);
cout<<*a<<endl<<*(a + 1)<<endl<<*(b-1)<<endl;
最后输出是:
1
2
5
这里有个梗就是两种+1究竟背后是加了多少,这个关键是得知道是谁在+1:
(1)a+1,a是一个指向一个int值的指针+1,所以+1背后实际是+ 1 * sizeof(int *),也就是 + 4bytes,也就是加了一个int的空间,最后自然a + 1的结果是 a[1] 的地址,所以*(a+1)的结果是a[1]的值2.
(2)&a + 1,a是一个指向数组头元素(一个int)的指针,那么&a就是一个数组的指针,这个指针的单位是一个a[5]这么大的一个数组,所以后面的 + 1 变成了
+ 1 * sizeof(size为5的数组) = + 20bytes也就是5个int的空间,所以最后int *b = (int *)(&a + 1)得到的b是指向a[5]元素的地址的指针,直接*b取值(a[5])的话就导致数组越界了。
(3)最后,b已经变成了一个指向a[5]元素的指针,也就是一个int指针,所以最后b -1 中的-1实际是 - 1 * sizeof(int) = - 4bytes,最后b - 1是指向了a[4]的地址,所以*(b-1)取的是a[4]的值。
综上,两种不同的+1,关键在于是谁在+1,也就是被加者的单位或者说单元是什么,a + 1中a的单位是一个int指针(单位大小为4bytes)),&a + 1中单位是一个数组指针(单位大小为该数组的总bytes数,例如本例子中是20bytes),最后无论是+1还是+2还是+n,都只需要化成 + n * (sizeof(单位))。