关于课堂上的指针和参考

时间:2014-10-03 07:26:23

标签: c++ pointers

这是我的程序

class Base
{
public:
  void fc()
  {
    cout << "Class function is called" << endl;
  }
};

void main()
{
  Base* ptr;
  ptr = 0;
  Base b1, b2;
  *ptr = b1;
  ptr->fc();
  ptr = 0;
  ptr = &b2;
  ptr->fc();
}

运行正常 我的问题很简单:

您可以通过* ptr = b1将对象分配给指针;或者ptr =&amp; b1;那么这两者之间有什么区别呢?你可以深入了解为什么有两种方法可以分配指针,如果它们实现了相同的目标?它们根本不同吗?

其次,有些人称'&amp;'参考标志,有人说这是“得到的地址”可以有人清楚这个吗?更多关于引用和指针之间的区别是什么?

非常感谢

莱纳斯

3 个答案:

答案 0 :(得分:1)

当您执行* ptr = b1时,您正在执行的操作如下: 1)取消引用已经在内存位置的对象指向ptr 2)将b1的成员复制到1

中引用的对象

这就是为什么,如果您使用成员变量,您的代码会给您一个分段错误。请考虑为您的班级进行以下修改:

#include <iostream>
#include <string>

class Base
{
public:
    Base():name("undefined")
    {
    }

    Base& operator=(const Base& other){
        std::cout << "Copying from " << other.name << " to " << name << std::endl;
        name = other.name;
        return *this;
    }

    void fc(){
        cout<<"Class function is called"<<endl;
    }

    std::string name;
};

现在,通过上述修改,以下代码将为segfault:

int main()
{   Base *ptr; ptr=0;
    Base b1,b2;
    *ptr=b1; // will segfault here
    ptr->fc();
    ptr=0;
    ptr=&b2;
    ptr->fc();
    return 0;
}

在第二种情况下,即当你打电话时

  

PTR =安培; B2;

您正在做的只是设置ptr指向的内存位置的地址。因此,以下代码将运行良好:

int main()
{   Base *ptr; ptr=0;
    Base b1,b2;
    ptr=&b2;
    ptr->fc();
    return 0;
}

更具说明性的例子如下:

int main()
{   Base *ptr;

    Base objA;
    objA.name = "objA";
    Base objB;
    objB.name = "objB";

    ptr = new Base();
    ptr->name = "ptrObj";
    *ptr = objA;
    std::cout << "Ptr is now " << ptr->name << std::endl;

    ptr = &objB;
    std::cout <<  "Ptr is now " << ptr->name << std::endl;    

    return 0;
}

其中给出了以下输出:

Copying from objA to ptrObj
Ptr is now objA 
Ptr is now objB

答案 1 :(得分:0)

  

您可以通过* ptr = b1将对象分配给指针;或者ptr =&amp; b1;那是什么?   这两者之间存在差异,

首先取消引用ptr并更改ptr指向的地址中的值。第二个更改内存中ptr指向b1地址的位置。但是在您的示例中,由于ptr没有指向内存中的有效地址,因此取消引用它将导致未定义的行为。< / p>

  

其次,有些人打电话给&#39;&amp;&#39;参考标志,有人说它得到的地址是&#39;有人可以为我清楚这一点吗?

这取决于上下文。例如,当您像ptr = &b1一样使用它时,它意味着地址操作符。当你在声明中使用它时,它意味着对ex的引用:int &i;意味着i是对int的引用。如果你在布尔表达式中使用它,则意味着{{1} }或者可能是AND操作员。我可能还有其他任何风俗,但重要的是要知道它的含义取决于你使用它的位置。

答案 2 :(得分:0)

@balajeerc你会有这样的内存泄漏...你现在指向对象objB,之前保留的内存不能被访问也不能被释放。