Указатели на указатели в C ++ - PullRequest
1 голос
/ 07 февраля 2020

Здравствуйте, я новичок в c ++ и пытаюсь понять, как использовать указатели для изменения одного и того же объекта.

Если у меня есть вектор указателей, например

std::vector<myclass*> top;

и допустим, что top [0] = NULL. Я хочу использовать другой указатель, чтобы изменить его

myclass* other = top[0];
other = new myclass();

, чтобы при доступе к top [0] он указывал на новый объект создан? Извините, что немного сбивает с толку, но это идея.

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Если, например, у вас был вектор int:

std::vector<int> vec(10);

, а затем что-то вроде

int other = vec[0];
other = 5;

Я думаю, что большинство людей поймут, что задание other = 5; изменит только значение переменной other, а не значение vec[0].

Теперь давайте возьмем ваш код:

myclass* other = top[0];
other = new myclass();

Здесь все точно так же: Присвоение other = new myclass(); только изменяет переменную other и, куда она указывает, не изменяется top[0].

То, что я считаю , вы хотите использовать other как ссылка на значение в top[0], что можно сделать с помощью ссылок:

myclass*& other = top[0];
other = new myclass();

Теперь other будет ссылкой на значение в top[0], поэтому назначение изменится top[0].

И для полноты картины, и, следуя указаниям указателя на указатель в заголовке, вы, конечно, можете решить его с помощью указателей на указатели:

myclass** other = &top[0];
*other = new myclass();

С указанным выше other будет указатель на top[0], и вам нужно использовать оператор разыменования * (как в *other) в назначении для изменения значения на top[0]. Я действительно рекомендую ссылки, хотя.

0 голосов
/ 07 февраля 2020

У вас есть вещи немного отсталые:

myclass *other = new myclass();
top[0] = other;

РЕДАКТИРОВАТЬ:

Вам нужно взять адрес элемента вектора:

std::vector<myclass*> top(5);
myclass *other = new myclass();
other->x = 4;
top[0] = other;
printf("top[0].x=%d\n", top[0]->x);
myclass **p = &top[0];
(*p)->x = 5;
printf("top[0].x=%d\n", top[0]->x);

Вывод :

top[0].x=4
top[0].x=5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...