&a 、 a、 &a[0]都是一个值,指向首地址。
&p1是取指针p1的地址,不是p1内容的地址。p1 p2相等,但是&p1 不等于p2。
p3 与 数组a没关系,但是因为a[4]正好索引到数组a最后一个成员的下一个地址,因此正好是p1的地址。这段解释比较麻烦,画个图会明白些。
简单的说,局部动态变量的空间是在栈内分配,而不是一个全局性的不变的量。进入函数以后,按顺序,从栈的空间中,给函数中定义的各变量分配空间。在你的函数中,最前面4个int型分配给数组a,接下来分配给三个指针p1/p2/p3。 因为数组a是int型,每个成员占用4个字节。而指针占用也是32位,正好与int型相同。注意,32位系统中,指针都是32位长。因此p1 p2 p3的地址,相当于数组a顺序往下数第5、6、7个成员。也就是说
&a[4] == &p1
&a[5] == &p2
&a[6] == &p3
a、&a[0]、&a都是数组的首元素地址
&p1指指针变量p1的地址;p2是指针变量。从程序上看p2的值是和p1相等的,都是数组的首元素地址,明显和p1的地址不等。
p3的值是数组a后面的一个地址,从运行的结果看 p1变量存放的位置就在数组a后面。
printf("%p,%d,%p,%p,%p",p1,*p1,&p1,p2,p3);
好像没有%p这种吧?应该是你写指针的时候写多了,代码看错了吧
p2=&a就是让p指向a的地址而不是a的内容,由于p1也占一个内存,&p1代表的是p1的地址而不是a的首地址
你的程序本来就写的有错误吧!你真的可以运行吗?用的什么工具啊?
int main(void)
{
int a[4]={1,2,3,4};
int * p1,*p2,*p3;
p2=&a;//这种赋值是错误的吧
p1=a;
p3=&a[4];
printf("%p,%d,%p,%p,%p",p1,*p1,&p1,p2,p3);
getch();//这里应该改为getchar();
return 0;
}
p3=&a[4];
这句话不对,越界了