指针数组

指针数组

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");
}

结果运行图:

该图证明了

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