一个指针问题,不会了。帮忙看看

五号智能 2008-06-26 02:34:06
c++primer第4版

习题4.17

已知指针p1 和 p2 指向同一个数组的元素,下面语句实现什么功能?

p1+=p2-p1;

当p1和p2具有什么值的时候这个语句是非法的? //这句没想明白,试也试过了,没试出什么不合法的地方
...全文
410 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hurry281 2008-06-28
  • 打赏
  • 举报
回复
p2 < p1 的时候,可能出现负数,这样后p1 += p2 - p1;指向的值,可能益出
zhy282289 2008-06-28
  • 打赏
  • 举报
回复
楼主把题目理解错了~~~!!!!
那个"已知指针p1 和 p2 指向同一个数组的元素" 这个已知是用在第一问的"下面语句实现什么功能? "的.
而那个"当p1和p2具有什么值的时候这个语句是非法的?"已经没用上面那个"已知..."了.
原题就是这个意思了.你多读几遍就应该明白了.



而那个已知指针p1 和 p2 指向同一个数组的元素时:p1+=p2-p1 是一直合法的~!
jinjunweiruan 2008-06-28
  • 打赏
  • 举报
回复
相减是得到一个差值....内存之见的...
cross2 2008-06-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sukyin 的回复:]
此语句使得p1也指向p2原来所指向的元素。原则上说,只要p1和p2的类型相同,则该语句始终是合法的。只有当p1和p2不是同类型指针时,该语句才不合法(不能进行-操作)。

但是,如果p1和p2不是指向同一个数组中的元素,则这个语句的执行结果可能是错误的。因为-操作的结果类型ptrdiff_t只能保证足以存放同一数组中两个指针之间的差距。如果p1和p2不是指向同一个数组中的元素,则-操作的结果有可能超出ptrdiff_t类型的表示范围而…
[/Quote]
貌似是中文版答案的原文解答
matrixdwy 2008-06-28
  • 打赏
  • 举报
回复
大概是P2 - P1是负数,而且加上P1之后变成负数后就非法了吧。毕竟指针只能是非负整数
五号智能 2008-06-28
  • 打赏
  • 举报
回复
这个题,可能是翻译的问题,“同一数组的元素”,为了便于理解,我把“一”字后面加上量词“个”

“同一 个 数组的元素”


可以理解成两种意思
第一种:“同一个”“数组的元素” 这种情况,只要指针指向数组之中,都合法
第二种:“同一个数组的”“元素” 这种情况,当p2小于p1时,在相减过程中,会指向数组外
,但,没有其它操作,也是合法的,然后又相加回来,
就又处于合法状态。

其实,在很多情况下,虽然指向的同一数组,这个表达式也是不合法的。比如void型的指针,
或是指向类私有成员指针。。很多情况。

不知道这个题问的是什么意思。
特别是在问题中它是这样强调:当p1和p2具有什么“值”的时候这个语句是非法的?

这句话,应该这样理解,当p1和p2在某些“值”的时候,是非法的,而在正常的情况下,它是合法的。
这就是问题另人迷惑的所在。因为我没有找到,当这两个指针指向“同一个数组”时,它非法的所在。
除非推翻它问题的描述。两个指针不是指“同一数组”。但,如果不是指向“同一数组”,这个问题
就失去了它提问的根本,变得没有意义。

最后说的话:如果“无值型(void)”的“无值”,也算一种“值”的话,我想,这就是正确答案
晚上12点结帖,不想为这个无意义的题讨论下去了。




summersdw1 2008-06-27
  • 打赏
  • 举报
回复
这题目原来的意思是想让读者意识到当两个指针指向同一数组时且指针值运算后不会益处的时候将2个指针运算是可以的,
而楼主所说的当p1 p2为和值时表达式不合法,如果P1 P2一直指向同一数组,那么这个表达式永远合法,所以只有当p1 p2指向不同数组时才非法!!!
czx605 2008-06-27
  • 打赏
  • 举报
回复
p1+=p2-p1; //2个指针不能相加,但是指针可以加一个整数偏移整数个原来类型的字节
所以 p2-p1 结果为整数时該式子合法,说的不对纯做见笑
crushor 2008-06-27
  • 打赏
  • 举报
回复
考虑运算顺序?中间的临时结果可能越界?
mzf333 2008-06-27
  • 打赏
  • 举报
回复
应该是指针所代表的边界方围超出数组边界的时候

oxiaoano 2008-06-27
  • 打赏
  • 举报
回复
5楼说的对!
fangbing007 2008-06-26
  • 打赏
  • 举报
回复
呵呵,不好意思,我把题看错了,我以为是指向同一个数组的同一个元素!
p1+=p2-p1;既然在同一个数组中,那么执行这句后,p1还是指向原来的那个值
如果p1,p2不是在同一个数组的话,那么p1与p2相减,根本就无意义!
fangbing007 2008-06-26
  • 打赏
  • 举报
回复
p1+=p2-p1;等同于p1+=0;还是指向原来的那个数组中的数!
除非P1和P2不是指向同一个数组,那样P2-P1根本没意义!
五号智能 2008-06-26
  • 打赏
  • 举报
回复
p1+=p2-p1;

当p1和p2具有什么“值”的时候这个语句是非法的?

这个题还真让人费解啊,不知道哪位大大看过纯英文版的
说说,这个题的本意是什么?

如果以p1+=p2-1 不为"特殊值"时为合法的情况下,,那p1和p2是什么“值”的情况下为不合法的呢
richbirdandy 2008-06-26
  • 打赏
  • 举报
回复
p1+=p2-p1;
p1=p1+p2-p1;
汗 真没看出来什么特别的
长尾巴的悟空 2008-06-26
  • 打赏
  • 举报
回复
同一类型的才是合法的.
五号智能 2008-06-26
  • 打赏
  • 举报
回复
p1+=p2-p1

p1=p1+(p2-p1)

不要混淆+=概念
五号智能 2008-06-26
  • 打赏
  • 举报
回复
p1+=p2-p1

p1=p1+(p2-p1)

不要混淆+=概念
sukyin 2008-06-26
  • 打赏
  • 举报
回复
此语句使得p1也指向p2原来所指向的元素。原则上说,只要p1和p2的类型相同,则该语句始终是合法的。只有当p1和p2不是同类型指针时,该语句才不合法(不能进行-操作)。

但是,如果p1和p2不是指向同一个数组中的元素,则这个语句的执行结果可能是错误的。因为-操作的结果类型ptrdiff_t只能保证足以存放同一数组中两个指针之间的差距。如果p1和p2不是指向同一个数组中的元素,则-操作的结果有可能超出ptrdiff_t类型的表示范围而产生溢出,从而该语句的执行结果不能保证p1指向p2原来所指向的元素(甚至不能保证p1为有效指针)。
yyyapple 2008-06-26
  • 打赏
  • 举报
回复
1. p1, p2指向同一个元素;
2. 估计p1+p2溢出了的时候
加载更多回复(2)

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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