Использование указателя в куче для c ++ - PullRequest
0 голосов
/ 25 мая 2020

Я изучаю основы C ++ и столкнулся с этим вопросом, когда изучал указатели. Я понимаю, что * используется для доступа к значению адреса, хранящемуся в указателе. Итак, если бы я сделал это:

int *p;
p = new int[5];

, почему вторая строка создала бы массив в куче и сохранила бы адрес массива в p? Мы не разыменовали p во второй строке, выполнив *p. Насколько мне известно из моих ограниченных знаний, выполнение p=value будет сохранять это значение в указателе p, тогда как мы должны хранить адрес этого значения в указателе p.

Ответы [ 2 ]

3 голосов
/ 25 мая 2020

Мы не разыменовывали p во второй строке, выполнив * p.

Что хорошо. В первой строке указатель не был инициализирован, поэтому он ни на что не указывает. Попытка получить доступ к воображаемому заостренному объекту путем косвенного обращения через указатель, который не указывает на объект, приводит к неопределенному поведению.

Насколько мне известно, выполнение ap = value будет хранить это значение в указателе p

Что именно мы и хотим сделать , когда это значение является адресом объекта.


PS В примере происходит утечка памяти. Избегайте использования голых указателей владения. Используйте std::vector, чтобы создать динамический массив c.

0 голосов
/ 25 мая 2020

Может быть сложно понять указатели.

Предположим, что на Великой улице № 234 есть дом. Об этом доме никто не знает.

Теперь человеку А, который живет в другом месте, рассказывают об этом доме. Информация - это просто адрес дома. В информации есть плюс: там написано «это дом, ничего другого».

То же самое и с указателями.

int *p;
p = new int[5];

int *p - это человек А. В этот момент он ничего не знает, кроме того, что последний будет проинформирован о доме. То, что это связано с домом, а не с автомобилем, связано с int. Вместо этого автомобиль будет float.

int[5] - это дом, только что построенный в результате действия new. Эта команда new не только создает массив, но также возвращает адрес, это "GreatStreet no 234" (или его эквивалент в позиции кучи).

p= new... сообщает человеку A адрес дом.

С указателями хорошо то, что вы можете работать не только с «человеком А» (по p), но и с его информацией о доме (по звездочке в *p).

Итак, вы можете сменить дом, если воспользуетесь методом звездочки (разыменование) *p = 3. Но вы не можете изменить адрес дома.

Если вы измените информацию указателя p= ... без звездочки, вы измените адрес на другой дом.

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