Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lection3.doc
Скачиваний:
6
Добавлен:
17.12.2018
Размер:
139.78 Кб
Скачать

Освобождение памяти

После окончания работы с массивом, когда выделенная ранее память перестанет быть нужной, ее необходимо освободить, чтобы дать возможность операционной системе использовать эту память по своему усмотрению, например, выделить другой программе. Для этого используется унарный оператор delete, единственный операнд которого — адрес, по которому начинается память, ранее выделенная оператором new, которую мы хотим освободить. Например:

delete pi;

При этом сам указатель pi не уничтожается, ему можно присвоить новое значение, однако разыменование этого указателя может привести к ошибке.

Общая схема

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

Int n; // Размер массива

cout<<«Введите размер массива: «;

cin>>n;

double * p; // Указатель на начало массива

p=new double[n]; // Выделяем память

if(p==0) // Проверка успешности выделения памяти

{

cout<<«Невозможно выделить память»<<endl;

return 1; // Завершаем работу с кодом возврата 1

}

for(int i=0;i<n;++i) // Цикл для считывания массива

cin>>p[i]; // Считали i-й элемент массива

// Теперь выполняем что-нибудь с

// массивом

delete p; // Освобождаем память

Операции над указателями

Указателям можно присваивать значение, являющееся указателем того же типа (которое может быть результатом оператора new, оператора & или другим указателем того же типа). К указателям можно применять оператор разыменования *. Кроме этого с указателями можно выполнять ряд других операций. Далее мы предполагаем, что p и q — указатели одного типа, например, объявленные как int *p, *q.

Как и числа, указатели можно сравнивать между собой.

p==q

Проверка двух указателей на равенство (т.е. указывают ли они на одну и ту же ячейку памяти)

p!=q

Проверка указателей на неравенство

p<q

Возвращает true, если ячейка, на которую указывает p находится в памяти раньше, чем ячейка, на которую указывает q. Аналогично определяются сравнения p<=q, p>q, p>=q.

Как всегда, нельзя путать операторы проверки на равенство p==q и присваивания p=q. В результаты выполнения оператора присваивания p будет указывать туда же, куда и q, значения же ячеек памяти, на которые указывали p и q не изменятся.

К указателям можно прибавлять и вычитать целые числа. Пусть p указывает на начало массива. Тогда p+0 равно p, p+1 — это указатель на следующий элемент массива, то есть &p[1], и для любого положительного i операция p+i — это указатель на p[i]. Вычитание из указателя 1 (а также прибавление к указателю -1) возвращает указатель на переменную, которую можно разместить в памяти непосредственно перед переменной, на которую указывает p.

Если p указывает не на начало массива, а на произвольную ячейку памяти, к значению p можно прибавлять целые числа, при этом результат будет такой же, как описано выше.

Также к указателям можно применять оператор доступа к элементам массива []: p[0] при этом означает переменную, хранящуюся в ячейке памяти, на которую указывает p, p[1] — следующую за ней, а p[-1] — предшествующую ей и т.д.

Поскольку определены операторы сложения и вычитания указателя с целыми числами, то указателям можно применять операции инкремента ++, декремента --, а также увеличивать (+=) и уменьшать -= значения указателей на целые значения.

Наконец, два указателя одного типа можно вычитать друг из друга. В этом случае оператор вычитания p-q возвращает целое число, при прибавлении которого к указателю q получается указатель p.

Никакие другие операторы к указателям применять нельзя. В частности, указатели нельзя складывать, умножать, умножать указатель на число и т.д.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]