社区
C语言
帖子详情
一道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
打赏
收藏
一道C的指针问题
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。点解?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
再再论
指针
深入解析c语言
指针
问题
造成了
指针
比C语言其它概念难理解得多,这使得对
指针
认识不足成为了一种在C程序员中普遍存在的现象,这种不足必然导致程序员在
指针
的使用过程中不断遭受挫折,挫折多了,
指针
俨然变成
一道
无法逾越的难关,恐惧感也就...
C语言
指针
实验报告
有关
指针
的
一道
上机实验题,有源程序,可以详细了解
指针
的概念及相关应用
C语言
指针
应用实战:字符串解析
曾经从朋友那见过
一道
题,解析以下字符串"abc=b\\n;c=\\x61d;...出于强化自己C语言
指针
应用能力的目的,写了如下代码。运行结果也已经打包进资源中。如有需求可在评论中回复,看到后回抽时间讲解回复。
C语言
指针
经验
指针
绝对是C语言学习的
一道
坎,但是我们想要用C语言实现高效开发有绝对不能放弃对
指针
的掌握。这是一份关于C语言
指针
的经验总结,对比各种常见
指针
类型,帮你迅速掌握
指针
!!
再论论
指针
(
指针
详细剖析)
造成了
指针
比C语言其它概念难理解得多,这使得对
指针
认识不足成为了一种在C程序员中普遍存在的现象,这种不足必然导致程序员在
指针
的使用过程中不断遭受挫折,挫折多了,
指针
俨然变成
一道
无法逾越的难关,恐惧感也就...
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章