比较指针和参考

Posted

技术标签:

【中文标题】比较指针和参考【英文标题】:Compare pointer with reference 【发布时间】:2019-11-29 03:46:54 【问题描述】:

我正在重构遗留代码。我必须比较指针与引用是否相等(检查两个对象是否相等)。 SO中的This question通过比较地址来实现。如果我对下面的指针和引用做同样的事情,会不会有任何问题(任何例外情况?)。到目前为止,在我的测试中,它工作正常。请指教

#include <stdio.h>
#include <iostream>

class MemberData

    //Huge class with many data members
;

int main()

    MemberData  x ;
    const MemberData& y = x;
    MemberData *ptr= &x;


    if(std::addressof(*ptr)==std::addressof(y))
    
            std::cout << "Both are equal" << "\n";  
    

    return 0;

【问题讨论】:

当你说检查两个对象是否相等你的意思是检查它们是否相等,或者检查它们是否是完全相同的对象 @Tas 检查完全相同的对象。请检查我的 cmets 是否有 erorika 【参考方案1】:

std::addressof(*ptr) 似乎是多余的。如果您有一个指向对象的指针,并且您需要一个指向该对象的指针,那么为什么要通过指针间接获取指向对象的指针呢? ptr == std::addressof(y) 应该也能正常工作。只要你想比较地址的相等性...

(检查两个对象是否相等)

比较地址的相等性是比较身份,即它们是否是同一个对象。要比较对象的相等性,您通常会比较它们的值。例如,以下变量不是同一个对象,因此没有相同的地址,但它们的值相等(假设健全的复制构造函数):

MemberData x;
MemberData y = x;

【讨论】:

我最好解释一下大局。一个向量容器具有成员列表,我比较的成员是来自向量容器的函数内的 const &memberdata。由于它一直是 const& 参考,因此无需比较它们的价值,而且它很昂贵,因为它很大。所以身份比较就足够了。【参考方案2】:

您提供的代码将始终打印“Both is equal”,因为您所做的是检查 x 的地址和 x 的别名的地址,这当然是相同的。真正的问题是您是否只想检查地址的相等性而不是它们的内部成员,即两个具有不同地址但具有相同值的相同类的对象。

【讨论】:

以上是关于比较指针和参考的主要内容,如果未能解决你的问题,请参考以下文章

OC 对象等同性

为啥 C++11 包含一个关于比较 void 指针的奇怪子句?

C语言指针学习总结

c++智能指针介绍_再补充

指针和参考问题

Go教程附录指针