" integers" « endl;
for(int Index = 0; Index < InputNums; ++Index)
{
cout « "Enter number " « Index « ": " ;
cin » * (pNumbers + Index);
}
18
cout « "Displaying all numbers input: " « endl;
for(int Index = 0, int* pCopy = pNumbers;
cout « * (pCopy++) « " ";
cout « endl;
// указатель больше не используется? Освободить память
delete[] pNumbers;
return 0;
Динамическое распределение памяти
|
181
|
Результат
How many integers you wish to enter? 2
Successfully allocated memory for 2 integers
Enter number 0: 789
Enter number 1: 575
Displaying all numbers input:
789 575
Другой запуск:
How many integers you wish to enter? 5
Successfully allocated memory for 5 integers
Enter number 0: 789
Enter number 1: 12
Enter number 2: -6 5
Enter number 3: 285
Enter number 4: -101
Displaying all numbers input:
789 12 -65 285 -101
Анализ
Программа запраш ивает у пользователя количество целых чисел, которые он хочет ввести в систему, прежде чем резервировать память для них в строке 9. Обратите внима ние, как мы сохраняем резервную копию этого адреса в строке 10, которая использует ся впоследствии при освобождении этого блока памяти оператором d e l e t e в строке 26. Эта программа демонстрирует преимущество использования указателей и динамического распределения памяти перед статическим массивом. Когда пользователь желает хранить меньше чисел, данное приложение использует меньше памяти; когда чисел больше, он резервирует больше памяти, но никогда не растрачивает ее впустую. Благодаря динами ческому распределению нет никакого верхнего предела для количества хранимых чисел, если только они полностью не исчерпают системные ресурсы. Строки 13-17 содержат цикл f o r , где пользователя просят ввести числа, которые затем, в строке 16, сохраня ют их последовательно в памяти, используя выражение. Именно здесь отсчитываемое от нуля значение смещения (In d e x ) добавляется к указателю, заставляя вставлять введенное пользователем значение в соответствующую область памяти, не перезаписывая предыду щее значение. Другими словами, выражение (pNum ber + In d e x ) возвращает указатель на целое число в отсчитываемой от нуля индексной области в памяти (т.е. индекс 1 при надлежит второму числу), а следовательно, оператор обращения к значению * (pNumber + Index) и является тем выражением, которое оператор c i n использует для доступа к зна чению по отсчитываемому от нуля индексу. Цикл f o r в строках 20 и 21 подобным образом отображает эти значения, сохраненные предыдущим циклом. Создавая копию в указателе рСору и увеличивая ее содержимое в строке 21, чтобы отобразить значение, цикл f o r ис пользует несколько выражений инициализации.
Причина создания копии в строке 10 в том, что цикл изменяет указатель, используемый
операторе инкремента (++). Исходный указатель, возвращенный оператором new, дол жен храниться неповрежденным для использования в операторе d e l e t e [ ] (строка 26), где должен быть использован адрес, возвращенный оператором new, а не любое произвольное значение.
182 ЗАНЯТИЕ 8. Указатели и ссылки
Do'stlaringiz bilan baham: |