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

news/2024/10/4 10:58:03 标签: 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");
	}
	 

}

输出结果:

 


http://www.niftyadmin.cn/n/5689844.html

相关文章

华为资源分享

紫光云文档中心提供弹性计算服务文档https://www.unicloud.com/document/product/ElasticComputeService/index.html报文格式华为报文格式资料Info-Finder&#xff08;在线工具&#xff09; 报文格式华为IP网络电子书华为IP网络相关电子书IP网络系列丛书 - 华为企业业务华为产品…

vue2 + View design 使用inputNumber设置默认值为undefined但展示数据为1且表单校验不通过的原因

文章目录 一、背景二、操作步骤1.复现前的准备工作&#xff08;1&#xff09;vue版本和view design 版本&#xff08;2&#xff09;创建一个组件&#xff08;组件中根据类型渲染不同的组件&#xff09;&#xff08;3&#xff09;在list.vue页面中引入组件&#xff0c;传入配置&…

大厂笔试现已经禁用本地IDE怎么看

如果我说本来面试做题这种事情就是反人类你相信吗&#xff1f; 这个罪恶的源头就是 Google&#xff0c;说是为了选择高素质的计算机编程水平的人才&#xff0c;然后把面试就变成了考试&#xff0c;最大的受益者当然是印度人了。 当把一个考察过程变成标准化的考试过程&#x…

【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

一天认识一个硬件之键盘

今天分享的这个硬件&#xff0c;就比较常见了&#xff0c;日常的生活&#xff0c;学习&#xff0c;工作都需要用到。但是可能很少人去了解键盘&#xff0c;而且也不知道为什么有些键盘卖的特别贵&#xff0c;也不知道键盘与键盘之间的区别。我先从什么是键盘开始分享&#xff0…

kotlin协程

Kotlin协程在解决传统Java线程管理问题方面表现出显著的优势。 简化线程创建和管理&#xff1a;在Java中&#xff0c;使用Thread或ExecutorService来创建和管理线程不仅代码复杂&#xff0c;而且容易出错。需要手动管理线程池&#xff0c;控制并发数量&#xff0c;以防止资源耗…

Hive数仓操作(十二)

一、Hive 中的行列转换 1. 行转列&#xff1a; collect_list() collect_list() 函数用于将一个列中的数据收集成一个数组。 示例数据文件 假设有一个名为 orders.txt 的文件&#xff0c;内容如下&#xff1a; 1,101 1,101 1,103 2,104 2,105导入数据到 Hive 表 首先&…

【C++】模拟实现红黑树

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 &#x1f4cc;实现RBTreeNode类模板 &#x1f38f;构造RBTreeNode类成员变量 &#x1f38f;实现RBTreeNode类构…