有没有办法检查内存地址是否在其他两个地址之间?

Is there a way to check if a memory address is between two other addresses?

假设,我有这样的代码:

//two separate arrays of the same object that for the purposes of this question we will assume are not adjacent in memory
ObjectName* m_objects0 = new ObjectName[10];
ObjectName* m_objects1 = new ObjectName[10];

//and a pointer to a single object
ObjectName* m_pObject = nullptr;

如果我想遍历 m_objects0 中的每个对象直到到达末尾,然后“跳转”到 m_objects1 的开头来遍历它,我将如何检查地址是否m_pObject 位于任一数组的起始地址和结束地址之间? (我唯一的信息是每个数组的开始和结束地址)它是否可行?

我能想到的实现它的唯一方法是以某种方式将地址转换为 int

您可以使用 ==!= 运算符检查给定指针是否(不)等于任何其他指针。

但是,您可以检查给定的指针是否是 <(=)>(=) 另一个指针 仅当两个指针都指向同一个 [=37] 时 =],否则行为未定义。

因此,当 m_pObject 指向 m_objects0 中的元素时,您无法使用地址范围检查它是否(不)指向 m_objects1 中的元素。

但是,您可以改为执行以下操作:

ObjectName* m_objects0 = new ObjectName[10];
ObjectName* m_objects1 = new ObjectName[10];

...

ObjectName* object_ptrs[] = {
    m_objects0, m_objects0 + 10,
    m_objects1, m_objects1 + 10
};

for(int i = 0; i < 4; i += 2)
{
    ObjectName* m_pObject = object_ptrs[i];
    ObjectName* m_pObjects_end = object_ptrs[i+1];

    while (m_pObject != m_pObjects_end)
    {
        ...
        ++m_pObject;
    }
}

...

Online Demo

其中,您可以更进一步概括(即,如果您需要 2 个以上的数组)改为使用以下内容:

#include <vector>
#include <utility>

ObjectName* m_objects0 = new ObjectName[10];
ObjectName* m_objects1 = new ObjectName[10];
...

std::vector<std::pair<ObjectName*,ObjectName*>> object_ptrs;
object_ptrs.emplace_back(m_objects0, m_objects0 + 10);
object_ptrs.emplace_back(m_objects1, m_objects1 + 10);
...

for(auto &p : object_ptrs)
{
    ObjectName* m_pObject = p.first;
    ObjectName* m_pObjects_end = p.second;

    while (m_pObject != m_pObjects_end)
    {
        ...
        ++m_pObject;
    }
}

...

Online Demo