指针数组
1 2 3 4 5 6 7 8 9 10 11
   | main()
  {
  int a[5]={1,2,3,4,5};
  int *ptr=(int*)(&a+1);
  printf("%d,%d",*(a+1),*(ptr-1));
  }
   | 
 
输出:2,5
&a是数组指针,其类型为 int (*)[5];
而指针加1要根据指针类型加上一定的值,
不同类型的指针+1之后增加的大小不同
a是长度为5的int数组指针,所以要加 5*sizeof(int)
所以ptr实际是a[5]
但是prt与(&a+1)类型是不一样的
所以prt-1只会减去sizeof(int*)
a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].
演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | #include<iostream>  int main(){ 	int a[5] = { 1, 2, 3, 4, 5 }; 	int *ptr = (int*)(&a + 1); 	std::cout <<"a[0]的地址"<< &a[0] << std::endl; 	std::cout << "a[1]的地址" << &a[1] << std::endl; 	std::cout << "a[2]的地址" << &a[2] << std::endl; 	std::cout << "a[3]的地址" << &a[3] << std::endl; 	std::cout << "a[4]的地址" << &a[4] << std::endl; 	std::cout << "a的地址" << &a << std::endl; 	std::cout << "&a + 1的地址" << &a + 1 << std::endl; 	std::cout << "(int*)&a + 1的地址" << (int*)&a + 1 << std::endl; 	system("pause"); }
   | 
 
结果运行图:

该图证明了
- a,a[0]的地址是一样的
 
- &a+1=a的地址+sizeof(a)(=5)
 
- (int*)&a:把&a强制转换成int类型的指针,该基础上加一表示下一个数的地址