我知道只有当两个指针指向"分配"到分配给同一个对象的存储的某个地方时,或者如果它们是NULL,或者只要它没有被解除引用而超过对象的末尾,就会定义指针比较.
我在标准的'C'意义上使用"对象".
是否有一些特殊的分配用于比较两个指针 - 每个指针超过对象的结尾,而不是比较一个过去的结束指针和一个引用实际对象的指针表达式.鉴于以下定义:
char arr[100];
char *pend = &arr[99];
char *pa = pend+1;
char *pb = pend+1;
Run Code Online (Sandbox Code Playgroud)
是pa == pb保证有意义的比较还是调用UB,因为-pa和pb都指向arr.
换句话说,从标准的角度来看,比较pa和pb以及比较pa和&arr[99]+1?之间是否存在语义差异?看起来很明显但是:)
小智 8
这是一个很好的例子,说明为什么你不应该把你的问题标记为C和C++:
对于C,这是标准所涵盖的.
6.5.9平等运营商
6两个指针比较相等,当且仅当两个都是空指针时,两者都是指向同一对象的指针(包括指向对象的指针和在其开头的子对象)或函数,两者都是指向同一对象的最后一个元素的指针数组对象,或者一个是指向一个数组对象末尾的指针,另一个是指向不同数组对象的开头的指针,该数组对象恰好跟随地址空间中的第一个数组对象.
对于C++,它不是那么清楚:
5.10平等运算符[expr.eq]
1
==(等于)和!=(不等于)运算符具有与关系运算符相同的语义限制,转换和结果类型,除了它们的优先级和实际值较低的结果.[ 注:a<b == c<d就是true每当a<b与c<d具有相同的真值.- 结尾注释 ]可以比较相同类型的指针(指针转换后)的相等性.相同类型的两个指针比较相等,当且仅当它们都为空时,都指向相同的函数,或者两者都表示相同的地址(3.9.2).
从技术上讲,我没有看到标准要求两个过去的指针代表相同的地址.我可以找到标准要求对象具有地址的位置,并且&操作符返回该特定地址(因此将地址取两次产生相同的指针值),但是过去的结束指针不指向对象,所以这不适用.它们可能不同,只要减去工作以返回到相同的数组库.
但实际上,您不必担心这一点,它将在C++中与C中一样有效.
更新:根据JohnB的答案和那里的评论,C++标准可能打算更明确地要求这一点,但它确实需要间接地要求它.