我正在尝试用c ++的指针包住头,使用指针而不是仅使用&variable在该位置获取对象有什么意义?
例如(实际上并没有运行此代码,仅作为示例):
int score{10};
int *score_ptr {nullptr};
score_ptr = &score;
cout << "Address of score is: " << &score << endl; // why not just this?
cout << "Address of score is: " << score_ptr << endl; // more work for same?
答案 0 :(得分:0)
&score
是类型为“指向int的指针”的prvalue。 prvalue的意思是“当然可以在赋值语句右侧的值”。
int* score_ptr
是类型为“指向int的指针”的左值。这意味着它可以放在赋值语句的左侧。
区别在于,一个是没有身份的值,另一个是有身份的变量。
您无法执行&&score
,但是您可以执行&score_ptr
。您可以分配给score_ptr
,不能分配给&score
。
指针类似于一张纸,上面写有街道地址。值是街道地址。
指针变量是一条街道地址,上面有一张纸写着另一个街道地址在哪里。
假设您每4个月要搬一次家;也许你是大学的合作学生。向某人提供您的当前地址是浪费时间,因为几个月后将是垃圾。给他们父母的地址,然后让他们将您的邮件转发给您,更有意义。
在这里,您生活在int
中。如果您告诉某人您父母的地址(地址为int*
类型的变量的地址),即使您四处走动,他们也可以向您发送邮件。
答案 1 :(得分:0)
有人会在C ++中使用指针的原因有很多
我认为最基础的是与new
结合使用。例如,这是C ++中的未定义行为:
SomeClass* someFunc() {
SomeClass out;
return &out;
}
这是未定义的行为,因为out
在someFunc
内仅具有有效的内存位置,因此任何调用该函数的人都将处理错误的SomeClass
实例。解决此问题的正确方法是:
SomeClass* someFunc() {
SomeClass* out = new SomeClass();
return out;
}
另一个原因可能与nullptr
结合使用。举例来说,您在程序中有一堆硬编码的人,并且正在实现电话目录。运行该程序的用户输入一个电话号码,如果该电话号码不属于任何人,则该程序会提供指向该人的指针或nullptr
。您仅使用&
另一个原因是管理从通用类继承的扩展类
答案 2 :(得分:0)
指针还可以帮助您避免切片问题。 例如,如果您从同一个父类派生了许多不同的类,而您想将它们放入父数据类型的列表中
#include <vector>
class Parent{
protected:
//variables common to all the children of the parent class
public:
//methods common to all the children classes
}
class Child1: public Parent{
private:
//data unique to this class
public:
//methods unique to this class
}
class Child2: public Parent{
private:
//data unique to this class
public:
//methods unique to this class
}
std::vector<Parent*> listOfInstances;
Child1 instance1;
Child2 instance2;
listOfInstances.push_back(instance1);
listOfInstances.push_back(instance2);
如果称为listOfInstances
的向量不是指针,则Child1
和Child2
唯一的所有数据都将被切断,并且这两个实例都将成为类的实例Parent