一道C的指针问题

gzlsc 2003-08-03 07:55:06
main()
{int a[]={2,4,6},*pr=&a[0],x=6,y,z;
for(y=0;y<4;y++)
z=(*(pr+y)<x)?*(pr+y):x;
printf("%d\n",z);}


请问为什么z的结果为6,既pr+3地址指向了x,所以*(pr+3)的值为6。点解?
...全文
21 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzlsc 2003-08-04
  • 打赏
  • 举报
回复
main()
{int a[]={2,4,6},*pr=&a[0],y,x,z;
/*for(y=0;y<4;y++)
z=(*(pr+y)<x)?*(pr+y):x;*/
printf("pr+3=%d x=%d y=%d z=%d\n",pr+3,&x,&y,&z);}

用TC运行后结果是pr+3=-48 x=-46 y=-48 z=-44

若把第二行改为int a[]={2,4,6},*pr=&a[0],x,y,z;
则结果是pr+3=-48 x=-48 y=-46 z=-44
smilewang 2003-08-04
  • 打赏
  • 举报
回复
可以下一个肯定的结论
pr+3怎么指也不会指向变量x的.
证据如下:
第一种方法:(与编译器无关)
z=(*(pr+y)>x)?*(pr+y):x;//将"<"改为">",重新看结果,结果再为6的概率趋近于0

第二种方法:(与编译器有关)
main()
{
int kkk=5; <======================添加一个变量
int a[]={2,4,6},*pr=&a[0],x=6,y,z;
for(y=0;y<4;y++)
z=(*(pr+y)<x)?*(pr+y):x;
printf("%d\n",z);
}
在vc6中,输出的结果实际上就是kkk的值
MouseGod 2003-08-04
  • 打赏
  • 举报
回复
这是可能是因为你在变量定义的时候在内存中分配的是连续的空间 即数组在先,x变量在后
然后你在使用指针的时候又越出了数组的界限 这样的话指针就指向了x变量了。
bahanzo1 2003-08-04
  • 打赏
  • 举报
回复
越界了的问题,*(pr+3)的值是不定的
cxjddd 2003-08-04
  • 打赏
  • 举报
回复
z的值只与数组(包括越界的)最后一个数有关。
Yashmak 2003-08-04
  • 打赏
  • 举报
回复
越界!

不能武断的认为 *(pr+3)最后指向x,
因为事实上,下一个可能的位置是pr的最高位,
也许pr最高位恰巧小于或等于6,最后z就等于6。

z的值其实是无法预料的,
试着打开几个大的应用程序,
再执行该程序,z的值可能让你莫名其妙。

Caoyu015 2003-08-04
  • 打赏
  • 举报
回复
你将C文件编译成为ASM文件,如果你懂一点汇编的话应该很清楚了。 :)
shiningpolarstar 2003-08-04
  • 打赏
  • 举报
回复
main()
{int a[]={2,4,6},*pr=&a[0],x=6,y,z;
for(y=0;y<4;y++)
z=(*(pr+y)<x)?*(pr+y):x;
printf("%d\n",z);}
首先这个指针是指向数组a的首地址,数组a下标最大为2,当y=2的时候z=6,而for循环中没有包含printf("%d\n",z);所以z的值是从2变为4,又变为6,然后循环结束,执行打印语句,输出了最后z的值6,但是在y=3时,这个指针指向了一个数组的末端的下一个存储空间,所以这个值是不定的,但z=(*(pr+y)<x)?*(pr+y):x;中这个时候*(pr+y) 与x的值都是6,所以无论 *(pr+y)<x是真是假已经无所谓了
heyesuperman 2003-08-03
  • 打赏
  • 举报
回复
不是呀,你把for(y=0;y<4;y++)中y的终值改变一下,
如y<3,y<2,y<1
你再运行看看结果,不是*(pr+3)的地址是x的地址吧
hillyee 2003-08-03
  • 打赏
  • 举报
回复
PS:当y=3时,在TC里面输出的是一个不定值。
hillyee 2003-08-03
  • 打赏
  • 举报
回复
这个问题肯定要个c的高手来看看才行,*(pr+3)的确有点问题,要根据编译器的特点而定的。不过可以这么理解。
当y=2的时候,z=(*(pr+y)<x)?*(pr+y):x; 输出的结果是z=(6<6)?6:6,所以z应该是等于后面的一个6。即z=6.
当y=3是,有些编译器里,虽然是错了,但是编译不报错。所以不执行了,结果就是z=6.
gzlsc 2003-08-03
  • 打赏
  • 举报
回复
各位,我要知道的是为什么*(pr+3)的地址是x的地址呢?
zhaolinyu2001 2003-08-03
  • 打赏
  • 举报
回复
main()
{int a[]={2,4,6},*pr=&a[0],x=6,y,z;
for(y=0;y<4;y++)
z=(*(pr+y)<x)?*(pr+y):x;
printf("%d\n",z);}
_______________________
printf()输出的是最后的值因此,你只要看for的最后一次循环结果就可以了
z=(*(pr+y)<x)?*(pr+y):x;
这是一个条件运算
MaiCle 2003-08-03
  • 打赏
  • 举报
回复
呵,都是数组越界惹得祸。
Areslp 2003-08-03
  • 打赏
  • 举报
回复
数组越界了,访问了数组a之后的x
riverboat 2003-08-03
  • 打赏
  • 举报
回复
pr+3 应该指向pr本身吧。
这种语句的执行结果可能在不同编译器上每次都不一样,
应该说是错误的用法。
airtraffic 2003-08-03
  • 打赏
  • 举报
回复
当y=3时,数组不是越界了吗?pr是a[2]后面一个元素的地址,所以题目有问题!
Caoyu015 2003-08-03
  • 打赏
  • 举报
回复
这种程序还是少写的好。:)
Caoyu015 2003-08-03
  • 打赏
  • 举报
回复
数组越界了,访问到了int a[3]之后x的地址,因为C/C++的局部变量的内存都是在栈中分配。
leafxx 2003-08-03
  • 打赏
  • 举报
回复
哦,看错了,z取得是x的值,x的值是6
加载更多回复(1)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧