为了好玩,我有一个std::list
const char*
,每个元素都指向一个以空字符结尾的文本字符串,并在其上运行std::list::sort()
。碰巧的是,它(没有双关语意)没有对字符串进行排序。考虑到它正在处理指针,这是有道理的。
根据std::list::sort()
的{{3}},它(默认情况下)使用元素之间的operator <
进行比较。
暂时忘记这个列表,我的实际问题是:这些(&gt;,&lt;,&gt; =,&lt; =)运算符如何处理C ++和C中的指针?他们只是比较实际的内存地址吗?
char* p1 = (char*) 0xDAB0BC47;
char* p2 = (char*) 0xBABEC475;
e.g。在32位小端系统上,p1
&gt; p2
因为0xDAB0BC47
&gt; 0xBABEC475
?
测试似乎证实了这一点,但我认为将它放在StackOverflow上以供将来参考是件好事。 C和C ++都对指针做了documentation,所以你真的不知道...
答案 0 :(得分:17)
在C ++中,您无法仅使用关系运算符来比较任何指针。您只能比较指向同一数组中的元素的两个指针或指向同一对象的成员的两个指针。 (当然,您也可以将指针与自身进行比较。)
但是,您可以使用std::less
和其他关系比较函数对象来比较任何两个指针。结果是实现定义的,但保证有总排序。
如果你有一个扁平的地址空间,指针比较可能只是比较地址就好像它们是整数一样。
(我相信C中的规则是相同的,没有比较函数对象,但有人必须确认;我对C语言的熟悉程度与C ++不同。)
答案 1 :(得分:8)
这只是一种补充。
在C ++ 20.3.3 / 8中:
对于模板更大,更少, greater_equal和less_equal ,. 任何指针类型的特化 即使产生总订单 内置运算符&lt;,&gt;,&lt; =,&gt; = do 不
在C 6.5.8 / 5中:
如果两个指针指向对象或 不完整的类型都指向 相同的对象,或两者都指向过去 同一个数组的最后一个元素 对象,他们比较平等。如果 指向的对象是成员 相同的聚合对象,指向 结构成员后来宣布 比指针大 成员在早些时候宣布 结构和指向数组的指针 具有较大下标值的元素 比指针大 具有较低的相同数组的元素 下标值。所有指针 同一个union对象的成员 比较平等。如果表达式P 指向数组的元素 对象和Q指向的表达式 同一个数组的最后一个元素 对象,指针表达式Q + 1 比较大于P. 在所有其他 案例,行为未定义。
所以,我认为比较char const*
属于两个不同的'\ 0'终止字符串,因为问题是未定义的行为(在C中)。
答案 2 :(得分:0)
是的,他们只是比较内存地址。