尝试学习指针,为什么使用指针而不是&?

时间:2019-07-07 21:31:09

标签: c++ c++11 pointers

我正在尝试用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?

3 个答案:

答案 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;
}

这是未定义的行为,因为outsomeFunc内仅具有有效的内存位置,因此任何调用该函数的人都将处理错误的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的向量不是指针,则Child1Child2唯一的所有数据都将被切断,并且这两个实例都将成为类的实例Parent