有没有办法检查内存地址是否在其他两个地址之间?
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;
}
}
...
其中,您可以更进一步概括(即,如果您需要 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;
}
}
...
假设,我有这样的代码:
//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;
}
}
...
其中,您可以更进一步概括(即,如果您需要 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;
}
}
...