这是我的程序
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;'参考标志,有人说这是“得到的地址”可以有人清楚这个吗?更多关于引用和指针之间的区别是什么?
非常感谢
莱纳斯
答案 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,之前保留的内存不能被访问也不能被释放。