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是一样的。谁能帮我解释一下? 展开
程序如下:
#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是一样的。谁能帮我解释一下? 展开
5个回答
展开全部
&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是取指针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编译器支持有关,我用到过的几个都支持这种写法,只是我们不这样写而已。大概可读性比较差或者早期的编译器结果不正常。。。
但是现在有考试题目就是考这个的,呵呵。。。。。讽刺吧。。。。
展开全部
a、&a[0]、&a都是数组的首元素地址
&p1指指针变量p1的地址;p2是指针变量。从程序上看p2的值是和p1相等的,都是数组的首元素地址,明显和p1的地址不等。
p3的值是数组a后面的一个地址,从运行的结果看 p1变量存放的位置就在数组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的首地址
好像没有%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;
}
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++的时候没有用过这种方法,而且我记得我们老师讲课的时候说这是错误的呢
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
p3=&a[4];
这句话不对,越界了
这句话不对,越界了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询