运算符如何使用指针?

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

根据std::list::sort()的文档 ,它(默认情况下)使用operator <在元素之间进行比较。

暂时忘记这个列表,我的实际问题是:这些(>, =,<=)运算符如何处理C ++和C中的指针? 他们只是比较实际的内存地址吗?

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

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

测试似乎证实了这一点,但我认为将它放在StackOverflow上以供将来参考是件好事。 C和C ++都对指针做了一些奇怪的事情 ,所以你真的不知道……

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

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

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

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

这只是补充。

在C ++ 20.3.3 / 8中:

对于模板greater,less,greater_equal和less_equal,任何指针类型的特化都会产生一个总顺序,即使内置运算符<,>,<=,> =也不行。

在C 6.5.8 / 5中:

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

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

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