昨天在优快云上看有个提了这个问题,好久没看指针了,当时还真有点迷糊,调试了下就明白了
int main()
{
int a[3] = {1,2,3};
int (*p)[3] = &a;
}
说明:
1.int (*p)[3]: p是一个指向整型数组的指针,指针指向的是一个数组,也就是数组指针
int *p[3]: 是一个由三个指针做为数组元素组成的整型数组,数组里面存放的是指针,即指针数组
2.int (*p)[3] = &a; 将指针p指向了数组a的首地址
3.此时*p指向的是数组a中第一个元素的首地址
4.如果将p++,则此时p指向了数组a的末地址,也就是a[3]的地址,跨越的是一个数组的长度
5.如果将*p++,则此时*p指向的是a[1]的地址,跨越的是一个数组元素的长度
6.p是指向数组a的首地址,是个二级指针;*p是指向数组a的第一个元素的地址,是一个一级指针
最后详细看下输出下面的值就明白了
int main()
{
int a[3] = {1,2,3};
int (*p)[3] = &a;
cout<<*p[0]<<endl; //此时输出的是a[0]的值
cout<<*(p[1]-1)<<endl; //输出a[2]的值
cout<<(*p)[2]<<endl; //输出a[2]的值
cout<<p[0][2]<<endl; //输出a[2]的值
cout<<p<<endl; //输出p的地址值
cout<<*p<<endl; //输出*p的地址值
p++;cout<<"After p++"<<endl;
cout<<p<<endl; //输出p的地址值
cout<<*p<<endl; //输出*p的地址值
cout<<**(p-1)<<endl; //输出a[0]的值
cout<<*(*p-1)<<endl; //输出a[2]的值
return 0;
}