社区
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。点解?
...全文
52
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语言题目展开,考查
指针
数组、
指针
加减整数和多级
指针
等内容。通过使用字符串数组、二级
指针
、三级
指针
存储和指向元素,用printf()函数打印结果。经画图分析
指针
与整数运算,得出各次打印答案,最后还可对代码进行拓展研究。
C语言面试那些事儿──
一道
指针
与数组
问题
博客围绕
一道
常见C语言面试题展开,该题考察了数组
指针
、数组首地址概念、
指针
运算规则等内容。通过Ubuntu系统运行结果,详细解释了数组地址、数组
指针
的类型及含义,以及
指针
加1操作的偏移量计算,展现了C语言
指针
的晦涩难懂与强大。
一道
“奇怪”的c
指针
问题
本文详细解析了
一道
关于C
指针
的练习题,深入探讨了
指针
、数组与内存之间的交互机制,特别关注了强制类型转换对
指针
位置的影响及内存访问的顺序模式,帮助理解C语言中
指针
的高级用法。
一道
c语言
指针
问题
!
本文通过两个实例深入探讨了在32位Intel平台上,不同类型的
指针
操作与内存分配的具体表现,包括字节序、内存地址计算及
指针
偏移等关键概念。
c语言
指针
和数组编程题,C语言数组和
指针
的
问题
一道
非常值得深思的笔试题
这篇博客探讨了
一道
关于C语言中数组和
指针
的笔试题,涉及到了负下标操作。通过示例代码解析了编译器如何将数组下标转换为
指针
运算,并解释了为何可以使用负下标以及其背后的内存地址计算。文章强调了理论知识在编程中的重要性,提醒读者注重基础和细节。
C语言
70,037
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章