社区
C++ 语言
帖子详情
一个指针问题,不会了。帮忙看看
五号智能
2008-06-26 02:34:06
c++primer第4版
习题4.17
已知指针p1 和 p2 指向同一个数组的元素,下面语句实现什么功能?
p1+=p2-p1;
当p1和p2具有什么值的时候这个语句是非法的? //这句没想明白,试也试过了,没试出什么不合法的地方
...全文
493
22
打赏
收藏
一个指针问题,不会了。帮忙看看
c++primer第4版 习题4.17 已知指针p1 和 p2 指向同一个数组的元素,下面语句实现什么功能? p1+=p2-p1; 当p1和p2具有什么值的时候这个语句是非法的? //这句没想明白,试也试过了,没试出什么不合法的地方
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
关于C语言
指针
在函数间传递是单向的
问题
题目:输入三个数,按从小到大顺序输出(用
指针
实现) 错误代码: #include<stdio.h> int main(int argc, char const *argv[]) { void swap(int *p1,int *p2); int a,b,c; int *p1=&a,*p2=&b,*p3=&c; printf("please input three numbers:"); scanf("%d %d %d",&
c语言中的null是大写,C语言空
指针
NULL以及void
指针
空
指针
NULL在C语言中,如果
一个
指针
不指向任何数据,我们就称之为空
指针
,用NULL表示。例如:int *p = NULL;注意区分大小写,null 没有任何特殊含义,只是
一个
普通的标识符。NULL 是
一个
宏定义,在stdio.h被定义为:#define NULL ((void *)0)(void*)0表示把数值 0 强制转换为void*类型,最外层的()把宏定义的内容括起来,我们自己进行宏定义时...
记录一次
指针
指向内存被修改的
问题
最近遇到了
一个
奇妙的
问题
,在
一个
抽奖活动里抽奖偶尔会出现发给客户端的数据不正确的情况,结果初步排查,发现这是由于有
一个
指针
指向的对象里的数据发生了错乱。而且很奇妙的,经常是抽了好几十次才出现一次这种情况 先来看一段代码 const Item* OnePiece::getRandItem(Lib* pLib, const std::set<DWORD>& extraSet) { std::vector<Item>& itemListCfg = pLib->it
Golang中遍历非
指针
对象的坑
前段时间写了个递归树,中间遇到了个坑,按逻辑看是没
问题
,没想到结果不对。 for _, v := range tree我在遍历这个tree数组的时候传递的是数组对象,修改了数组的内容但返回时发现没有变化。这就是golang和java的差别,遍历的时候如果是非
指针
对象,那么golang会copy
一个
副本v,你修改的只是v的值,除非你修改完再重新放入数组,否则结果是不...
空
指针
引起的崩溃
空
指针
引起的崩溃,以C++为例: #include<cstring> #include<cstdio> #include<iostream> using namespace std; int main() { char *a = "hello world"; char *b = NULL; cout << a<< endl; /...
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章