Попытка сделать указатель на динамически распределенный массив символов - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь выделить массив char в куче, а затем сделать указатель на него:

char * head;

char * coolArray = new char[5];

Это должно выделить 5 бит в куче с правильными символами?

head = &coolArray;

Невозможно сделать это ^ из-за &coolArray, являющегося char **?

Я могу это исправить, выполнив:

head = *&coolArray;

Но я не уверен, почему это работает.

Может кто-нибудь объяснить эту концепцию указания на то, что находится в куче?

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

"куча" и выделения памяти - красные сельди.

&coolArray это "где coolArray есть".
*p - это «вещь, которая находится в местоположении p».
*&x - это «вещь, в которой находится coolArray», то есть coolArray.

Это работает почти так же, как в реальном мире - "человек, который живет в доме, где живет Джек", сам Джек, верно?

Кстати, вы также можете написать head = coolArray;.

0 голосов
/ 26 августа 2018

Прежде всего, прежде всего, используйте std::string для обработки строк символов.

За исключением целей обучения, обычно не используют необработанные массивы, указатели и new выражения.


Это должно выделить 5 бит

Нет, он выделяет 5 байтов .

Байт - это наименьшая адресуемая единица памяти в C ++. Типы char, unsigned char и signed char, а также C ++ 17 и более поздние std::byte имеют гарантированный размер в байтах. Количество битов в байте обычно равно 8 и не менее 8, но может быть больше и определяется константой CHAR_BIT из заголовка <limits.h>.


head = &coolArray;

Просто напишите

head = coolArray;

Это присваивает значение указателя (значение в переменной указателя coolArray) переменной указателя.


head = *&coolArray;

Обычно для любой переменной v выражение &v дает указатель на эту переменную.

Разыменование этого указателя, *&v, обозначает ту же переменную. Так что вместо этого вы можете написать v.

...