CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

一道C的指针问题

楼主gzlsc(小壁虎)2003-08-03 19:55:06 在 C/C++ / 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。点解? 问题点数:0、回复次数:21Top

1 楼leafxx(因为音乐,所以自由)回复于 2003-08-03 20:11:40 得分 0

不是,是因为   pr是指向数组   a的,   在关于y的循环中,*(pr+0)就是a[0],*(pr+1)就是a[1];  
   
  当y=3时,   *(pr+3)其实是a[3],也就是6,z取的是*(pr+y)的值(这时y为3),也就是a[3],并不是   pr+3地址指向了x,指针变量pr的值没变,始终指的是a[0]的地址Top

2 楼leafxx(因为音乐,所以自由)回复于 2003-08-03 20:13:16 得分 0

哦,看错了,z取得是x的值,x的值是6Top

3 楼Caoyu015(酷鱼一代)回复于 2003-08-03 20:19:08 得分 0

数组越界了,访问到了int   a[3]之后x的地址,因为C/C++的局部变量的内存都是在栈中分配。Top

4 楼Caoyu015(酷鱼一代)回复于 2003-08-03 20:19:53 得分 0

这种程序还是少写的好。:)Top

5 楼airtraffic(free flight)回复于 2003-08-03 21:17:52 得分 0

当y=3时,数组不是越界了吗?pr是a[2]后面一个元素的地址,所以题目有问题!Top

6 楼riverboat(诸葛不亮)回复于 2003-08-03 22:09:05 得分 0

pr+3   应该指向pr本身吧。  
  这种语句的执行结果可能在不同编译器上每次都不一样,  
  应该说是错误的用法。Top

7 楼Areslp(努力ING)回复于 2003-08-03 22:14:57 得分 0

数组越界了,访问了数组a之后的xTop

8 楼MaiCle(原来小日本连畜生都不如)回复于 2003-08-03 22:20:21 得分 0

呵,都是数组越界惹得祸。Top

9 楼zhaolinyu2001(风中浪子)回复于 2003-08-03 22:26:01 得分 0

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;  
  这是一个条件运算  
  Top

10 楼gzlsc(小壁虎)回复于 2003-08-03 23:05:38 得分 0

各位,我要知道的是为什么*(pr+3)的地址是x的地址呢?Top

11 楼hillyee(山之笛)回复于 2003-08-03 23:23:29 得分 0

这个问题肯定要个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.  
  Top

12 楼hillyee(山之笛)回复于 2003-08-03 23:24:49 得分 0

PS:当y=3时,在TC里面输出的是一个不定值。Top

13 楼heyesuperman(中华之火)回复于 2003-08-03 23:32:12 得分 0

不是呀,你把for(y=0;y<4;y++)中y的终值改变一下,  
  如y<3,y<2,y<1  
  你再运行看看结果,不是*(pr+3)的地址是x的地址吧Top

14 楼shiningpolarstar(闪亮的北极星)回复于 2003-08-04 03:20:23 得分 0

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是真是假已经无所谓了Top

15 楼Yashmak(双层面纱)回复于 2003-08-04 04:34:09 得分 0

越界!  
   
  不能武断的认为   *(pr+3)最后指向x,  
  因为事实上,下一个可能的位置是pr的最高位,  
  也许pr最高位恰巧小于或等于6,最后z就等于6。  
   
  z的值其实是无法预料的,  
  试着打开几个大的应用程序,  
  再执行该程序,z的值可能让你莫名其妙。    
   
  Top

16 楼cxjddd(又是花开时)回复于 2003-08-04 08:32:20 得分 0

z的值只与数组(包括越界的)最后一个数有关。Top

17 楼bahanzo1(绯雨流烟)回复于 2003-08-04 09:20:15 得分 0

越界了的问题,*(pr+3)的值是不定的Top

18 楼MouseGod(客)回复于 2003-08-04 10:48:09 得分 0

这是可能是因为你在变量定义的时候在内存中分配的是连续的空间   即数组在先,x变量在后  
  然后你在使用指针的时候又越出了数组的界限   这样的话指针就指向了x变量了。  
  Top

19 楼smilewang(急速传说)回复于 2003-08-04 11:27:30 得分 0

可以下一个肯定的结论  
  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的值Top

20 楼gzlsc(小壁虎)回复于 2003-08-04 12:21:04 得分 0

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=-44Top

21 楼Caoyu015(酷鱼一代)回复于 2003-08-04 15:57:24 得分 0

你将C文件编译成为ASM文件,如果你懂一点汇编的话应该很清楚了。   :)Top

相关问题

  • 一道c++指针题,高手请进!
  • 问一道指针的笔试题
  • 一道面试题(指针问题)
  • 问一道关于多维数组指针的题
  • 问一道关于多维数组指针的题。
  • 指针!!!!
  • this指针
  • 指针?
  • 指针
  • 指针

关键词

  • pr
  • 结果
  • main

得分解答快速导航

  • 帖主:gzlsc

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo