指针数组
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类型的指针,该基础上加一表示下一个数的地址