比较相同类型的指针是否安全?

时间:2013-08-26 12:50:23

标签: c++ pointers c++11 comparison

char** buffer{ /* some buffer */ };
char* ptr1{buffer[0]};
char* ptr2{buffer[10]};

assert(ptr1 < ptr2);

如果两个指针指向同一个缓冲区中的不同位置,那么比较它们是否安全?

我想通过比较assert(rangeBeginPtr < rangeEndPtr)来了解指针是否有效。

3 个答案:

答案 0 :(得分:4)

您可以将指针与关系运算符(<><=>=进行比较,前提是它们都指向同一数组的元素,或者过去那个阵列。根据C ++ 11 5.9 Relational operators,任何其他内容都是未指定的行为。所以,给定:

char xyzzy[10];
char plugh[10];

所有这些都被指定为正常运行:

assert(&(xyzzy[1]) < &(xyzzy[4]));
assert(&(xyzzy[9]) < &(xyzzy[10])); // even though [10] isn't there.

但这些不是:

assert(&(xyzzy[1]) < &(xyzzy[15]));
assert(&(xyzzy[9]) < &(plugh[3]));

如果您要比较同一个数组中的两个元素,则类型不会进入它,除非它必须是相同的类型。如果您有两个char *个变量,那么如果它们指向不同的数组,即使它们具有相同的类型,也未指定。

答案 1 :(得分:3)

您只能使用数组对象确定指针的顺序,如果它们不是void。但是,在一个数组对象中,比较很明确。标准中的相关条款是5.9 [expr.rel]第2段:

  

[...]可以比较相同类型的对象或函数(指针转换后)的指针,结果定义如下:

     
      
  • 如果同一类型的两个指针pq指向同一个对象或函数,或者两个指针都指向同一个数组的末尾,或者都是null,那么{{1 {}}和p<=q两个产生p>=qtrue以及p<q都会产生p>q
  •   
  • 如果同一类型的两个指针falsep指向不是同一对象的成员或同一数组的元素或不同函数的不同对象,或者只指向其中一个为空,qp<qp>qp<=q的结果未指定。
  •   
  • 如果两个指针指向同一对象的非静态数据成员,或者指向此类成员的子对象或数组元素,则递归地指向稍后声明的成员的指针比较更大,前提是两个成员具有相同的访问控制(Clause) 11)并且他们的班级不是工会。
  •   
  • 如果两个指针指向具有不同访问控制的同一对象的非静态数据成员(第11条),则结果未指定。
  •   
  • 如果两个指针指向同一个union对象的非静态数据成员,则它们比较相等(如果需要,转换为p>=q之后)。如果两个指针指向同一个数组的元素或超出数组末尾的指针,那么指向具有较高下标的对象的指针会比较高。
  •   
  • 未指定其他指针比较。
  •   

答案 2 :(得分:2)

==!=对于所有相同类型的指针都是有效且定义良好的。 <<=>>=仅对指向同一数组中的对象或数组的一端的指针有意义。如果子对象具有相同的类型和相同的访问说明符,它们对于指向类对象的子对象的指针也很有意义。如果不满足这些条件,则结果未指定;一个直接后果是a<bb<c 暗示a<c,因此您不能使用<等作为比较器排序功能。

指针类型的

std::lessstd::less_equalstd::greaterstd::greater_equal都定义了总排序;它们可以用于分类。