【问题标题】:What does it mean to compare pointers using relational operators?使用关系运算符比较指针是什么意思?
【发布时间】:2017-11-10 18:50:43
【问题描述】:

如果我有两个指针变量 a 和 b,那么使用语句“a

【问题讨论】:

  • 我怀疑这样的事情会非常特定于语言。在某些幼稚的情况下,指针实际上是(或可以被视为)内存位置。在其他情况下,它们是一种非常特定的类型,并且运算符将具有特定于类型的行为。
  • 我对@9​​87654322@的回答也是相关的。

标签: c++ c pointers operators relational


【解决方案1】:

在 C 和 C++ 中,如果您有两个指向同一个数组的指针并希望查看它们的相对顺序,则允许使用关系运算符比较指针(此规则有一个例外,我稍后会提到)。例如,假设pq 各自指向数组arr 中间的某个位置,如下所示:

            int arr[9];
            int* p = &arr[1];
            int* q = &arr[4];

    +-----+-----+-----+-----+-----+-----+-----+-----+-----+
arr |     |     |     |     |     |     |     |     |     |
    +-----+-----+-----+-----+-----+-----+-----+-----+-----+
             ^                 ^
             |                 |
             p                 q

在这种情况下,表达式p < q 询问“p 指向的数组中的索引是否低于q 指向的数组中的索引?”在上述情况下,答案是“是的”。如果 pq 颠倒过来,或者如果它们指向完全相同的元素,则答案将是“否”。

C 和 C++ 中的语言标准都说比较不指向同一个数组的指针的结果是未指定的,这在直觉上是有道理的,因为不相关的对象可能几乎随机地分散在内存中,或者是相关的以一种依赖于实现的方式(你的堆栈是向上还是向下?)

对此的一个例外是,您可以将数组末尾的一个对象的指针与数组中的指针进行比较。例如,看看这个设置:

            int arr[9];
            int* p = &arr[1];
            int* q = &arr[9];

    +-----+-----+-----+-----+-----+-----+-----+-----+-----+
arr |     |     |     |     |     |     |     |     |     |
    +-----+-----+-----+-----+-----+-----+-----+-----+-----+
             ^                                              ^
             |                                              |
             p                                              q

这里,q 不指向数组arr。但是,语言规范允许您安全地比较 p 和 q。这就是为什么,例如,您可以在 C++ 中安全地使用这种迭代器风格的循环:

for (int* itr = arr; itr != arr + /* arr's size */; itr++) {
    ...
}

【讨论】:

  • 添加:“...如果您有两个指针指向同一个数组或对象”。这个数组讨论也适用于单个对象,就好像它是一个数组一样。 some_type x; &x+1 > &x 定义明确。 §6.5.8 4
  • 您还可以比较指向同一聚合对象成员的指针,例如,指向结构对象中的int a 的指针与指向同一对象中的double b 的指针。
  • @EricPostpischil 我不知道你能做到这一点。我假设您需要在不同类型的对象之间使用某种风格的 char * 指针以避免严格的别名违规?
  • @templatetypedef:我错了能够比较对象的不同成员。您可以比较对象的成员,但它们必须具有兼容的类型。然后标准说“如果指向的对象是同一个聚合对象的成员,则指向稍后声明的结构成员的指针比较大于指向结构中较早声明的成员的指针,并且指向具有较大下标值的数组元素的指针比较大于指向具有较低下标值的同一数组的元素。所有指向同一个联合对象成员的指针比较相等。”
  • @templatetypedef:我不能说我见过它使用过。有点奇怪;您必须有两个您知道指向同一个结构的指针,但您不知道它们指向的结构中的哪个位置。你忘了吗?为什么你还关心?我想有一种情况,你有一些链接结构,有时你指向结构的一个成员(例如,链中的“前向”链接),有时你指向另一个(例如,“反向”链接),并且比较可以让您找出特定指针指向的那些。
猜你喜欢
  • 2010-11-20
  • 2013-05-07
  • 2015-09-18
  • 2017-03-29
  • 2011-03-16
  • 2011-07-09
  • 2016-07-23
  • 1970-01-01
相关资源
最近更新 更多