【问题标题】:How do the operators < and > work with pointers?运算符 < 和 > 如何处理指针?
【发布时间】:2011-06-04 04:37:20
【问题描述】:

只是为了好玩,我有一个const char*std::list,每个元素都指向一个以null 结尾的文本字符串,并在其上运行std::list::sort()。碰巧的是,它有点(不是双关语)没有对字符串进行排序。考虑到它正在处理指针,这是有道理的。

根据std::list::sort()documentation,它(默认情况下)使用元素之间的operator &lt;进行比较。

暂时忘记列表,我的实际问题是:这些 (>、=、

char* p1 = (char*) 0xDAB0BC47;
char* p2 = (char*) 0xBABEC475;

例如在 32 位小端系统上,p1 > p2 因为0xDAB0BC47 > 0xBABEC475?

测试似乎证实了这一点,但我认为最好将其放在 StackOverflow 上以供将来参考。 C 和 C++ 都对指针做了一些weird things,所以你永远不会真正知道...

【问题讨论】:

  • 是的,它们只是比较内存地址。
  • Endiadness 在这里不相关。 p1 > p2 是大端还是低端。
  • 是的,我注意到了,但是用十六进制字符编写 DABOBCAT 和 BABECATS 很有趣,所以我忽略了这个例子的不那么伟大......
  • 有趣的是,&lt;algorithm&gt;std::list::sort 中的所有排序算法都默认使用 operator&lt;(我只需要查一下;我本以为他们会使用 std::less默认)。

标签: c++ c pointers comparison operators


【解决方案1】:

在 C++ 中,您不能使用关系运算符来比较任何指针。您只能比较指向同一数组中元素的两个指针或指向同一对象成员的两个指针。 (当然,您也可以将指针与其自身进行比较。)

但是,您可以使用std::less 和其他关系比较函数对象来比较任意两个指针。结果是实现定义的,但保证有一个总排序。

如果您有一个平坦的地址空间,那么指针比较很可能只是比较地址,就好像它们是整数一样。

(我相信 C 中的规则是相同的,没有比较函数对象,但必须有人确认这一点;我对 C 的熟悉程度不如对 C++ 的熟悉。)

【讨论】:

  • @Zac:指针不是整数,你不能这样比较。
  • @FredOverflow,是的 - 这里没有人能记住远近指针吗?
  • @Zac,NULL 是编译器保证的特殊情况。所有其他与整数的比较都会令人担忧。作为语言律师,我还不足以说令人担忧。
  • @Zac:您能否提供“比较 2 个指针总是将地址作为整数比较”的标准来源?
  • @Zac:您说“比较 2 个指针总是将地址作为整数进行比较。”那是假的。
【解决方案2】:

这只是一个补充。

在 C++ 20.3.3/8 中:

对于模板更大、更少、 大于等于和小于等于 任何指针类型的特化 产生一个总订单,即使 内置运算符 , = do 不是。

在 C 6.5.8/5 中:

如果两个指向对象的指针或 不完整的类型都指向 同一个物体,或两者都指向过去 同一数组的最后一个元素 对象,它们比较相等。如果 指向的对象是 相同的聚合对象,指向 稍后声明的结构成员 比较大于指针 之前宣布的成员 结构体和指向数组的指针 具有较大下标值的元素 比较大于指针 相同数组的元素具有较低的 下标值。所有指向的指针 同一个联合对象的成员 比较相等。如果表达式 P 指向数组的一个元素 对象和表达式 Q 指向 同一数组的最后一个元素 对象,指针表达式 Q+1 比较大于 P。在所有其他 情况下,行为未定义

所以,我认为比较 char const* 在问题中属于两个不同的 '\0' 终止字符串是未定义的行为(在 C 中)。

【讨论】:

    【解决方案3】:

    是的,他们只是比较内存地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 2013-05-26
      • 2015-10-21
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      相关资源
      最近更新 更多