自学内容网 自学内容网

C或C++判断指针是否指向同一块内存

有时需要判断指针是否指同一块内存,例如设计字符串时:

(1)insert函数

(2)  replace函数

(3)assign函数

难点是迭代器,判断是否同一个迭代器时,需要你在设计迭代器时加入一些功能。

 还有昨天介绍的MoveBack函数:

/// <summary>
/// 不改变原有数据,把内存段区间 [begin,pend) 向后移动nCount位,后面的
/// 数据会pend后面会覆盖nCount-1个,包括pend就是nCount个,如果bFilling
/// 为True,则用相应的pFilling所指的数据填充空出来的内存。
/// 例:
///_string s = "sss123   www";
///MoveBack(s.begin(), s.begin() + 6, 3, true, s.end() - 3);
///     结果:s=wwwsss123www
/// 
/// 注意:pFilling 与 pbegin,pend,不能在同一区域的内存块中。
/// 
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="pbegin">开始位置</param>
/// <param name="pend">结束位置</param>
/// <param name="nCount">移运个数</param>
/// <param name="bFilling">是否填充</param>
/// <param name="pFilling">指向填充数据的指针</param>
/// <returns></returns>
/// 创建时间:2024-10-03    最后一次修改时间:2024-10-03 (已测试)
template<class T>
T* MoveBack(T* pbegin, T* pend, const size_t& nCount,
const bool& bFilling = false, const T* pFilling = null){

assert(pend >= pbegin);

for (size_t n = 0; n < pend - pbegin; ++n) {

*(pend + nCount - 1 - n) = *(pend - 1 - n);
}

if (bFilling && pFilling) { //检查bFilling不能在区间[pbegin,pend + nCount)中

assert(pFilling < pbegin || pFilling >= pend + nCount);

for (size_t n = 0; n < nCount; ++n) {

*(pbegin + n) = *(pFilling + n);
}
}

return pbegin;
}

其实很简单,看例子:

/// <summary>
/// 判断pt是否指向区块内存[pbegin,pend)。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="pbegin"></param>
/// <param name="pend"></param>
/// <param name="pt"></param>
/// <returns></returns>
/// 创建时间:2024-10-04    最后一次修改时间:2024-10-04
template<class T>
bool isPointsToTheSameMemoryArea(const T* pbegin, const T* pend, const T* pt)
{
return pt >= pbegin && pt < pend;
}

int main() {
  
_string s = "567891234";

const wchar_t* p1 = s.c_str() + 5;
const wchar_t* p2 = _t("1234");

_cout << _t("p1=") << p1 << _t("\n");
_cout << _t("p2=") << p2 << _t("\n");

if (isPointsToTheSameMemoryArea(s.begin(), s.end(), p1)) {

_cout << _t("p1与字符串s指向同一块内存区域!\n");
}
else
{
_cout << _t("p1与字符串s指向不同内存区域!\n");
}

if (isPointsToTheSameMemoryArea(s.begin(), s.end(), p2)) {

_cout << _t("p2与字符串s指向同一块内存区域!\n");
}
else
{
_cout << _t("p2与字符串s指向不同内存区域!\n");
}
 

}

输出结果:

 


原文地址:https://blog.csdn.net/weixin_42944928/article/details/142698430

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!