数组中指针不同加1的区别

#include 
int main(){
    int a[5] = {1,2,3,4,5};
    int* p= (int*)(&a+1);

    printf("%d",*(p-1));  // 这段代码会输出4
}

原因:
array和&array的值是一样的,但是他们代表的意义完全不一样,array是数组首元素的首地址(和&array[0]一样),&array是整个数组array的首地址.

“+1”就是偏移量问题:一个类型为T的指针的移动,是以sizeof(T)为移动单位。

  • 即array+1:在数组首元素的首地址的基础上,偏移一个sizeof(array[0])单位。此处的类型T就是数组中的一个int型的首元素。
  • 即&array+1:在数组的首地址的基础上,偏移一个sizeof(array)单位。此处的类型T就是数组中的一个含有5个int型元素的数组。

注意:在以下两中场合下,数组名并不是用指针常量来表示:
当数组名作为sizeof操作符和单目操作符&的操作数时。 sizeof返回整个数组的长度,而不是指向数组的指针的长度。 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。所以&a后返回的指针便是指向数组的指针,跟a(一个指向a[0]的指针)在指针的类型上是有区别的。

你可能感兴趣的:(c++)