试图学习指针,为啥要使用它们而不是 &?

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;

这是未定义的行为,因为outsomeFunc 内只有一个有效的内存位置,所以任何调用该函数的人都会处理一个错误的SomeClass 实例。正确的处理方法是:

SomeClass* someFunc() 
    SomeClass* out = new SomeClass();
    return out;

另一个原因可能与nullptr 结合使用。例如,假设您在程序中硬编码了一群人,并且您正在实现电话目录。运行该程序的用户输入一个电话号码,如果该电话号码不属于任何人,该程序会给出一个指向该人的指针或nullptr。仅使用 &amp;

您将无法发出“不属于任何人”的信号

另一个原因是管理继承自公共类的扩展类

【讨论】:

【参考方案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 的向量不是一个指针,那么Child1Child2 独有的所有数据都将被截断,这两个实例都将成为Parent 类的实例

【讨论】:

【参考方案3】:

&amp;score 是“指向 int 的指针”类型的纯右值。 prvalue 的意思是“纯粹是一个可以放在赋值语句右侧的值”。

int* score_ptr 是“指向 int 的指针”类型的左值。这意味着它可以放在赋值语句的左侧。

不同的是,一个是没有身份的,另一个是有身份的变量

你不能做&amp;&amp;score,但你可以做&amp;score_ptr。可以分配给score_ptr,不能分配给&amp;score

指针类似于一张纸,上面写着街道地址。值是街道地址。

指针变量是街道地址,其中有一张纸说明另一个街道地址在哪里。

假设您每 4 个月搬家一次;也许你是大学的 coop 学生。给某人您当前的地址是浪费时间,因为几个月后它就会变成垃圾。向他们提供您父母的地址,然后让他们将您的邮件转发给您,会更有意义。

在这里,您住在int。如果您告诉某人您父母的地址(int* 类型变量的地址),即使您四处走动,他们也可以将内容发送给您。

【讨论】:

以上是关于试图学习指针,为啥要使用它们而不是 &?的主要内容,如果未能解决你的问题,请参考以下文章

为啥打印指针与打印取消引用的指针打印相同的东西?

为啥要使用 Deque 而不是内置 Stack<>? [复制]

为啥要使用 Deque 而不是内置 Stack<>? [复制]

为啥我们使用指针而不是简单地创建特定大小的数组?

为啥在这个程序中使用指针而不是常规变量?

为啥要使用 Objectify 而不是 JDO?