试图学习指针,为啥要使用它们而不是 &?
Posted
技术标签:
【中文标题】试图学习指针,为啥要使用它们而不是 &?【英文标题】:Trying to learn pointers, why use them instead of just &?试图学习指针,为什么要使用它们而不是 &? 【发布时间】:2019-07-07 21:31:09 【问题描述】:我正在尝试用 C++ 中的指针来解决问题,使用指针与仅使用 &variable 来获取该位置的对象有什么意义?
举例(没有实际运行过这段代码,只是举例):
int score10;
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?
【问题讨论】:
这与任何其他类型的变量相同。例如。为什么要使用int x = 42;
,而不是每次都写42
?
在堆中分配内存时需要指针,例如使用new
运算符。
指针可以是 NULL/nullptr,这一切都不同
What are the differences between a pointer variable and a reference variable in C++?的可能重复
您的示例是一个玩具练习,它演示了指针是什么,而不是在实际代码中如何使用指针。也许您只需要耐心等待,直到看到更复杂的示例。
【参考方案1】:
人们想要在 C++ 中使用指针的原因有很多
我认为最基本的是与new
结合使用。例如,这是 C++ 中未定义的行为:
SomeClass* someFunc()
SomeClass out;
return &out;
这是未定义的行为,因为out
在someFunc
内只有一个有效的内存位置,所以任何调用该函数的人都会处理一个错误的SomeClass
实例。正确的处理方法是:
SomeClass* someFunc()
SomeClass* out = new SomeClass();
return out;
另一个原因可能与nullptr
结合使用。例如,假设您在程序中硬编码了一群人,并且您正在实现电话目录。运行该程序的用户输入一个电话号码,如果该电话号码不属于任何人,该程序会给出一个指向该人的指针或nullptr
。仅使用 &
另一个原因是管理继承自公共类的扩展类
【讨论】:
【参考方案2】:指针还可以帮助您避免切片问题。 例如,如果您有许多从同一个父类派生的不同类,并且您想将它们放入数据类型父列表中
#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
类的实例
【讨论】:
【参考方案3】:&score
是“指向 int 的指针”类型的纯右值。 prvalue 的意思是“纯粹是一个可以放在赋值语句右侧的值”。
int* score_ptr
是“指向 int 的指针”类型的左值。这意味着它可以放在赋值语句的左侧。
不同的是,一个是没有身份的值,另一个是有身份的变量。
你不能做&&score
,但你可以做&score_ptr
。可以分配给score_ptr
,不能分配给&score
。
指针类似于一张纸,上面写着街道地址。值是街道地址。
指针变量是街道地址,其中有一张纸说明另一个街道地址在哪里。
假设您每 4 个月搬家一次;也许你是大学的 coop 学生。给某人您当前的地址是浪费时间,因为几个月后它就会变成垃圾。向他们提供您父母的地址,然后让他们将您的邮件转发给您,会更有意义。
在这里,您住在int
。如果您告诉某人您父母的地址(int*
类型变量的地址),即使您四处走动,他们也可以将内容发送给您。
【讨论】:
以上是关于试图学习指针,为啥要使用它们而不是 &?的主要内容,如果未能解决你的问题,请参考以下文章
为啥要使用 Deque 而不是内置 Stack<>? [复制]