使用关系运算符比较指针意味着什么?

时间:2017-11-10 18:50:44

标签: c++ c pointers operators relational

如果我有两个指针变量a和b,使用语句“a< b”是什么意思?这样做应该比较他们的内存地址的值?如果是这样,计算机中的内存地址顺序是什么?

1 个答案:

答案 0 :(得分:6)

在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++) {
    ...
}