首页 > 后端开发 > C++ > 正文

如何判断两个C++指针是否指向同一数组 标准库提供的比较方法

P粉602998670
发布: 2025-08-18 12:11:01
原创
381人浏览过

c++++中判断两个指针是否指向同一个数组,关键在于理解标准库对指针比较的定义;1. 指针比较的基础是它们必须指向同一数组的元素或数组末尾的下一个位置,否则行为未定义;2. 可通过指针算术判断指针是否落在已知数组范围内;3. 可使用std::begin和std::end检查多个指针是否都在同一数组区间内;4. 可封装通用函数以适用于固定大小数组的判断;此外需要注意避免跨数组比较、确保动态数组内存连续以及检查空指针等边界条件。

如何判断两个C++指针是否指向同一数组 标准库提供的比较方法

在C++中判断两个指针是否指向同一个数组,关键在于理解标准库对指针比较的定义。直接用

==
登录后复制
!=
登录后复制
运算符可以判断两个指针是否指向同一对象(包括数组中的元素),但要确保它们确实属于同一个数组,仅靠基本比较可能不够严谨。

如何判断两个C++指针是否指向同一数组 标准库提供的比较方法

指针比较的基础:相同对象或同一数组内的元素

C++标准允许你对两个指针进行比较的前提是:它们都指向同一个数组的元素,或者都指向“数组末尾的下一个位置”(即

arr + N
登录后复制
,其中
N
登录后复制
是数组大小)。在这种情况下,使用
==
登录后复制
<
登录后复制
>
登录后复制
等操作符是合法的。

如何判断两个C++指针是否指向同一数组 标准库提供的比较方法

比如:

立即学习C++免费学习笔记(深入)”;

int arr[10];
int* p1 = &arr[3];
int* p2 = arr + 3;

if (p1 == p2) {
    // 成立,因为都指向arr数组中的第4个元素
}
登录后复制

但如果两个指针分别指向不同数组的元素,即使它们值相同,行为也是未定义的。例如:

如何判断两个C++指针是否指向同一数组 标准库提供的比较方法
int a[5], b[5];
int* p = a + 2;
int* q = b + 2;

if (p == q) { /* 未定义行为 */ }
登录后复制

所以,只有当两个指针明确指向同一个数组时,比较才有意义


判断是否来自同一数组的实用技巧

虽然C++没有专门的标准函数来判断两个指针是否来自同一个数组,但可以通过以下几种方式间接实现这一目标:

方法一:利用指针算术判断范围

如果知道其中一个指针是数组起始地址,可以用指针算术判断另一个指针是否落在该数组范围内。

标书对比王
标书对比王

标书对比王是一款标书查重工具,支持多份投标文件两两相互比对,重复内容高亮标记,可快速定位重复内容原文所在位置,并可导出比对报告。

标书对比王 58
查看详情 标书对比王
int arr[10];
int* p = arr + 5;
int* base = arr;

if (p >= base && p < base + 10) {
    // p 确实在 arr 数组内
}
登录后复制

这种方法适用于你知道数组边界的情况。

方法二:检查多个指针是否在同一个数组区间内

如果你有两个指针

p
登录后复制
q
登录后复制
,想确认它们是否都来自某个已知数组,可以这样写:

int arr[20];
int* p = &arr[3];
int* q = &arr[7];

if ((p >= std::begin(arr) && p < std::end(arr)) &&
    (q >= std::begin(arr) && q < std::end(arr))) {
    // p 和 q 都在 arr 中
}
登录后复制

这里用了

<iterator>
登录后复制
头文件中的
std::begin()
登录后复制
std::end()
登录后复制
,更通用且适合模板编程。

方法三:封装为通用函数(适用于固定大小数组)

你可以写一个简单的辅助函数来判断两个指针是否都位于给定数组的范围内:

template <size_t N>
bool are_in_same_array(int* p, int* q, int (&arr)[N]) {
    return (p >= std::begin(arr) && p < std::end(arr)) &&
           (q >= std::begin(arr) && q < std::end(arr));
}
登录后复制

调用示例:

int arr[10];
int* p = arr + 2;
int* q = arr + 5;

if (are_in_same_array(p, q, arr)) {
    // 都在 arr 内
}
登录后复制

这个方法在需要多次判断的情况下很有用。


注意事项与常见误区

  • 不要比较不相关数组的指针:如前所述,跨数组比较指针的行为是未定义的。
  • 动态分配的数组也适用:只要两个指针都在同一块连续内存中(比如
    new int[10]
    登录后复制
    ),上述规则同样适用。
  • 避免误判空指针:在做比较前,记得检查指针是否为
    nullptr
    登录后复制
    ,否则可能导致崩溃。

总的来说,判断两个C++指针是否指向同一数组,并没有一个标准库函数可以直接完成这项任务,但通过指针算术和一些辅助函数,我们可以安全地实现这一目的。只要记住比较前提和边界条件,就能写出健壮的代码。

基本上就这些。

以上就是如何判断两个C++指针是否指向同一数组 标准库提供的比较方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号