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");
	}
	 

}

输出结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值