<p>在<a >c++</a>++中判断两个指针是否指向同一个数组,关键在于理解<a >标准库</a>对指针比较的定义;1. 指针比较的基础是它们必须指向同一数组的元素或数组末尾的下一个位置,否则行为未定义;2. 可通过指针算术判断指针是否落在已知数组范围内;3. 可使用std::begin和std::end检查多个指针是否都在同一数组区间内;4. 可封装通用函数以适用于固定大小数组的判断;此外需要注意避免跨数组比较、确保动态数组内存连续以及检查空指针等边界条件。</p> <p><img src=”https://img.php.cn/upload/article/000/969/633/175549026395129.png” alt=”如何判断两个C++指针是否指向同一数组 标准库提供的比较方法”></p> <p>在C++中判断两个指针是否指向同一个数组,关键在于理解标准库对指针比较的定义。直接用<div class=”code” style=”position:relative; padding:0px; margin:0px;”><div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”>==</pre><div class=”contentsignin”></div></div><div class=”contentsignin”></div></div>或<div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”>!=</pre><div class=”contentsignin”></div></div>运算符可以判断两个指针是否指向同一对象(包括数组中的元素),但要确保它们确实属于同一个数组,仅靠基本比较可能不够严谨。</p> <img src=”https://img.php.cn/upload/article/000/969/633/175549026388448.png” alt=”如何判断两个C++指针是否指向同一数组 标准库提供的比较方法”><hr> <h3>指针比较的基础:相同对象或同一数组内的元素</h3> <p>C++标准允许你对两个指针进行比较的前提是:它们都指向<strong>同一个数组的元素</strong>,或者都指向“数组末尾的下一个位置”(即<div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”>arr + N</pre><div class=”contentsignin”></div></div>,其中<div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”>N</pre><div class=”contentsignin”></div></div>是数组大小)。在这种情况下,使用<div class=”code” style=”position:relative; padding:0px; margin:0px;”><div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”>==</pre><div class=”contentsignin”></div></div><div class=”contentsignin”></div></div>、<div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”><</pre><div class=”contentsignin”></div></div>、<div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”>></pre><div class=”contentsignin”></div></div>等操作符是合法的。</p> <img src=”https://img.php.cn/upload/article/000/969/633/175549026493809.png” alt=”如何判断两个C++指针是否指向同一数组 标准库提供的比较方法”><p>比如:</p> <p><span>立即学习</span>“<a href=”https://pan.quark.cn/s/6e7abc4abb9f” style=”text-decoration: underline !important; color: blue; font-weight: bolder;” rel=”nofollow” target=”_blank”>C++免费学习笔记(深入)</a>”;</p><div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=’brush:cpp;toolbar:false;’>int arr[10]; int* p1 = &arr[3]; int* p2 = arr + 3; if (p1 == p2) { // 成立,因为都指向arr数组中的第4个元素 }</pre><div class=”contentsignin”></div></div><p>但如果两个指针分别指向不同数组的元素,即使它们值相同,行为也是未定义的。例如:</p> <img src=”https://img.php.cn/upload/article/000/969/633/175549026498056.png” alt=”如何判断两个C++指针是否指向同一数组 标准库提供的比较方法”><div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=’brush:cpp;toolbar:false;’>int a[5], b[5]; int* p = a + 2; int* q = b + 2; if (p == q) { /* 未定义行为 */ }</pre><div class=”contentsignin”></div></div><p>所以,<strong>只有当两个指针明确指向同一个数组时,比较才有意义</strong>。</p> <hr> <h3>判断是否来自同一数组的实用技巧</h3> <p>虽然C++没有专门的标准函数来判断两个指针是否来自同一个数组,但可以通过以下几种方式间接实现这一目标:</p> <h4>方法一:利用指针算术判断范围</h4> <p>如果知道其中一个指针是数组起始地址,可以用指针算术判断另一个指针是否落在该数组范围内。</p><div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=’brush:cpp;toolbar:false;’>int arr[10]; int* p = arr + 5; int* base = arr; if (p >= base && p < base + 10) { // p 确实在 arr 数组内 }</pre><div class=”contentsignin”></div></div><p>这种方法适用于你知道数组边界的情况。</p> <h4>方法二:检查多个指针是否在同一个数组区间内</h4> <p>如果你有两个指针 <div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”>p</pre><div class=”contentsignin”></div></div> 和 <div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”>q</pre><div class=”contentsignin”></div></div>,想确认它们是否都来自某个已知数组,可以这样写:</p><div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=’brush:cpp;toolbar:false;’>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 中 }</pre><div class=”contentsignin”></div></div><p>这里用了 <div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”><iterator></pre><div class=”contentsignin”></div></div> 头文件中的 <div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”>std::begin()</pre><div class=”contentsignin”></div></div> 和 <div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”>std::end()</pre><div class=”contentsignin”></div></div>,更通用且适合模板编程。</p> <h4>方法三:封装为通用函数(适用于固定大小数组)</h4> <p>你可以写一个简单的辅助函数来判断两个指针是否都位于给定数组的范围内:</p><div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=’brush:cpp;toolbar:false;’>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)); }</pre><div class=”contentsignin”></div></div><p>调用示例:</p><div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=’brush:cpp;toolbar:false;’>int arr[10]; int* p = arr + 2; int* q = arr + 5; if (are_in_same_array(p, q, arr)) { // 都在 arr 内 }</pre><div class=”contentsignin”></div></div><p>这个方法在需要多次判断的情况下很有用。</p> <hr> <h3>注意事项与常见误区</h3> <ul> <li> <strong>不要比较不相关数组的指针</strong>:如前所述,跨数组比较指针的行为是未定义的。</li> <li> <strong>动态分配的数组也适用</strong>:只要两个指针都在同一块连续内存中(比如<div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”>new int[10]</pre><div class=”contentsignin”></div></div>),上述规则同样适用。</li> <li> <strong>避免误判空指针</strong>:在做比较前,记得检查指针是否为 <div class=”code” style=”position:relative; padding:0px; margin:0px;”><pre class=”brush:php;toolbar:false”>nullptr</pre><div class=”contentsignin”></div></div>,否则可能导致崩溃。</li> </ul> <hr> <p>总的来说,判断两个C++指针是否指向同一数组,并没有一个标准库函数可以直接完成这项任务,但通过指针算术和一些辅助函数,我们可以安全地实现这一目的。只要记住比较前提和边界条件,就能写出健壮的代码。</p> <p>基本上就这些。</p>
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧
相关推荐