下面这段代码让我匪夷所思,请高手指点!

来源:百度知道 编辑:UC知道 时间:2024/06/01 06:15:44
#include <iostream>
using namespace std;
int main()
{
int a[10];
for(int i=0;i<=9;i++)
a[i]=i; //为每个数组元素赋值

int (*p)[10];
p=&a; //p被赋值为a的地址
cout<<a<<endl; //0012FF58
cout<<p<<endl; //0012FF58 为什么它会等于a的值呢?它是a的地址啊?
cout<<(p)[1]<<endl; //0012FF80 这个是如何的来的呢?

return 0;
}

多谢!

不难理解的嘛
p是数组指针,p=&a;就是把a的地址赋值给p
a本身也可以看作一个指针,a和a的地址,是同一个地址。
比如:int b[10][10];
这里b是个二位数组,那么b和&b,&b[0],&b[0][0]等,都是同一个地址的
虽然,它们各自的含义不太一样,可以通过下面的程序看到这个结论:
main()
{
int b[10][10];

printf("%p\n",b);
printf("%p\n",&b);
printf("%p\n",&b[0]);
printf("%p\n",&b[0][0]);
}

p是数组指针,它指向int [10]类型的数组
(p)[1]和(p)[0]差int [10]占用的大小,即4×10=40个字节

p被你写成了一个函数指针,编译器在处理的时候 p 和 *p 的返回值是一样的。所以p虽然是a的地址,但是作*p处理。

(p)[1]就是*(p+1),地址自增40个字节,是因为p指向了a[10],a[10]的大小为40,所以p+1就是a[10]后面紧接着的内存的首地址,0012FF58+40
即0012FF80