Пытаясь выучить указатели, зачем использовать их вместо просто &? - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь обернуть голову вокруг указателей в 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 голосов
/ 08 июля 2019

Есть много причин, по которым кто-то хотел бы использовать указатель в C ++

. Я бы посчитал, что наиболее фундаментальным является сочетание с new.Например, это неопределенное поведение в C ++:

SomeClass* someFunc() {
    SomeClass out;
    return &out;
}

Это неопределенное поведение, потому что out имеет только допустимое место в памяти внутри someFunc, поэтому любой, вызывающий функцию, будет иметь дело с плохим SomeClass пример.Правильный способ справиться с этим:

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

Другая причина может быть в сочетании с nullptr.В качестве примера, скажем, у вас есть группа людей, жестко запрограммированных в программе, и вы внедряете телефонный справочник.Пользователь, запустивший программу, вводит номер телефона, и программа либо дает указатель на человека, либо nullptr, если номер телефона не принадлежит никому.Вы не смогли бы сигнализировать «принадлежит никому», просто используя &

Другая причина - управлять расширенными классами, которые наследуются от общего класса

0 голосов
/ 08 июля 2019

Указатели также помогут вам избежать проблемы нарезки. Например, если у вас было много разных классов, производных от одного и того же родительского класса, и вы хотите поместить их в список родительского типа данных

#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

0 голосов
/ 08 июля 2019

&score - это тип значения "указатель на int".prvalue означает «чисто значение, которое может находиться справа от оператора присваивания».

int* score_ptr является lvalue типа «указатель на int».Это означает, что он может идти с левой стороны оператора присваивания.

Разница в том, что один является значением , который не имеет идентичности, другой является переменной у которого есть личность.

Вы не можете сделать &&score, но вы можете сделать &score_ptr.Вы можете назначить на score_ptr, вы не можете назначить на &score.

Указатель похож на лист бумаги с написанным на нем уличным адресом.Значение - это уличный адрес.

Переменная-указатель - это уличный адрес, на котором есть лист бумаги, где указано, * другой адрес улицы.

Предположим, куда вы идетепереезды каждые 4 месяца;Может быть, вы студент кооператива в университете.Предоставление кому-либо вашего текущего адреса - пустая трата времени, так как через несколько месяцев он станет мусором.Предоставление им адреса ваших родителей и пересылка вам ваших писем имеет больше смысла.

Здесь вы живете в int.Если вы скажете кому-то адрес своего родителя - адрес переменной типа int* - они могут отправлять вам вещи даже после того, как вы переместитесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...