У меня возникли проблемы с пониманием следующего кода, который, как я надеялся, создаст массив в куче и заполнит его символами 9 до 0 (я знаю, что могу просто индексировать массив как обычный массив стека с [] нотацией, чтобы сделать это, но я делаю это таким образом, чтобы попытаться понять указатели в большей глубине):Создание массивов в куче и обращение к ним с помощью указателей
int *ptrHeapArray = new int[10];
for(int f=9; f>=0 ;f--)
{
*ptrHeapArray = f;
ptrHeapArray++;
}
for(int f=0; f<10; f++)
cout << ptrHeapArray[f] << "\n";
Он печатает compleletly неожиданных значений.
Как я понял выше, команда «new» создает массив в куче и отправляет обратно указатель на адрес, где находится массив. Поскольку указатель, который я присваиваю (ptrHeapArray), имеет размер int, я предположил, что могу использовать указатель post incrementing для перемещения по массиву. Однако результаты показывают, что мои предположения ошибочны.
Это заставило меня подумать, что, возможно, указатель, переданный ключевым словом 'new', является указателем на весь массив и не может использоваться для какого-либо шага по массиву. Так что я попытался создать другой указатель на указатель, возвращаемый «новой» ключевое слово и использовал это, чтобы сделать свой массив населения:
int *ptrHeapArray = new int[10]; //array to hold FRANK data in 32 bit chunks
int *ptrToHeapArrayPointer = ptrHeapArray;
for(int f=9; f>=0 ;f--)
{
*ptrToHeapArrayPointer = f;
ptrToHeapArrayPointer++;
}
for(int f=0; f<10; f++)
cout << ptrHeapArray[f] << "\n";
Это работало отлично. Может ли кто-нибудь объяснить мне, почему я должен был это сделать, и не мог просто использовать указатель, который был передан мне с помощью «нового» ключевого слова?
Благодаря
Он в основном сжимает голову вашего массива –
@Nathan: Не говорите так. Вы не различаете указатель и то, на что он указывает. Это различие новых программистов часто бывает трудно. «Глава массива» вообще не сбрасывается (перезаписывается). Это не изменилось. Просто нет указателя на него. – MSalters