运算符<和>如何使用指针?

Oys*_*ein 11 c c++ comparison pointers operators

只是为了好玩,我有一个std::listconst char*,每个元素都指向一个空结束的文本字符串,并跑了std::list::sort()就可以了.碰巧的是,它(没有双关语意)没有对字符串进行排序.考虑到它正在研究指针,这是有道理的.

根据文档std::list::sort(),它(默认)使用operator <的元件之间的比较.

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

char* p1 = (char*) 0xDAB0BC47;
char* p2 = (char*) 0xBABEC475;
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*lis 17

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

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

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

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

  • @FredOverflow,是的 - 这里有没有人能够记住远近指针? (9认同)
  • @Zac:指针不是整数,你不能这样比较它. (4认同)
  • @Zac:你说"比较2个指针总是把地址比作整数." 那是假的. (4认同)
  • @Zac,NULL是编译器保证的特殊情况.所有其他与整数的比较都会令人担忧.我不是一个语言律师,说多么令人担忧. (2认同)
  • @Zac:你能为"比较2个指针总是将地址比作整数"提供标准源吗? (2认同)
  • @Zac:这不合法,你不能比较指向整数的指针.你完全错了,指针不一定是整数,它们是具有实现定义表示的自己的类型. (2认同)

Ise*_*ria 8

这只是补充.

在C++ 20.3.3/8中:

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

在C 6.5.8/5中:

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

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