C语言指针和数组的问题,急!

我用的是WIN-TC程序如下:#include<stdio.h>intmain(void){inta[4]={1,2,3,4};int*p1,*p2,*p3;p2=&a;... 我用的是WIN-TC
程序如下:
#include<stdio.h>
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();
return 0;
}
运行结果如下:
FFCA,1,FFD2,FFCA,FFD2
p1=a是把数组的首地址付给p1,但是p2=&a是什么意思了?
&p1,p2的结果为什么不是一样的?反而和p3是一样的。谁能帮我解释一下?
展开
 我来答
thitaone
2012-01-30 · TA获得超过818个赞
知道小有建树答主
回答量:501
采纳率:0%
帮助的人:498万
展开全部
&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
追问
我懂了,p1=a;&p1是取的p1的地址,而不是a的地址。
但是看好多人说int *p2; p2=&a这种写法是错误的了?我编译没出错啊,难道是我win-tc落后了?
追答
通常不这样写,一般就是 p1 = a,或者p1 = &a[0]; 
但是事实上 p1 = &a 编译是正确的,实际操作也是正确的。
可能跟C编译器支持有关,我用到过的几个都支持这种写法,只是我们不这样写而已。大概可读性比较差或者早期的编译器结果不正常。。。
但是现在有考试题目就是考这个的,呵呵。。。。。讽刺吧。。。。
百度网友a03b094
2012-01-30
知道答主
回答量:8
采纳率:0%
帮助的人:5.9万
展开全部
a、&a[0]、&a都是数组的首元素地址
&p1指指针变量p1的地址;p2是指针变量。从程序上看p2的值是和p1相等的,都是数组的首元素地址,明显和p1的地址不等。
p3的值是数组a后面的一个地址,从运行的结果看 p1变量存放的位置就在数组a后面。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
吴铁骑
2012-01-30 · TA获得超过876个赞
知道小有建树答主
回答量:780
采纳率:60%
帮助的人:160万
展开全部
printf("%p,%d,%p,%p,%p",p1,*p1,&p1,p2,p3);
好像没有%p这种吧?应该是你写指针的时候写多了,代码看错了吧
p2=&a就是让p指向a的地址而不是a的内容,由于p1也占一个内存,&p1代表的是p1的地址而不是a的首地址
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
斌and丽
2012-01-30 · 超过10用户采纳过TA的回答
知道答主
回答量:44
采纳率:0%
帮助的人:17.9万
展开全部
你的程序本来就写的有错误吧!你真的可以运行吗?用的什么工具啊?
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;
}
更多追问追答
追问
我用的是WIN-TC,我看的是C Primer Plus中文版的,上面也有这样的例子,p2=&a是把数组a的首地址的地址付给p2吗?你说的错误是不是这样,数组a的首地只是一个16进制的常量,不能付给指针变量?
追答
p2=&a这个赋值不可以吧,我学C语言和C++的时候没有用过这种方法,而且我记得我们老师讲课的时候说这是错误的呢
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
淦海瑶s1
2012-01-30 · TA获得超过3646个赞
知道大有可为答主
回答量:3341
采纳率:100%
帮助的人:762万
展开全部
p3=&a[4];
这句话不对,越界了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式