До настоящего момента в рассмотренных примерах мы рассматривали указатели, которые указывали на уже существующие переменные. Но очень часто указатели используются для работы с динамическими переменными – переменными, которые могут создаваться и уничтожаться в процессе работы программы.
В этом случае все необходимые операции по созданию и удалению таких переменных должен выполнять программист. Он несет полную ответственность за корректную работу таких указателей.
Рассмотрим следующий пример:
int *pV;
*pV = 10;
С точки зрения компилятора все корректно: pV – это указатель на ячейку памяти, предназначенную для хранения значения типа int, 10 – это целое.
Но мы объявили не инициализированный указатель, это значит, что адрес, хранящийся в указателе pV, может указывать на случайную ячейку памяти (в том числе и на ту, которая может быть занята другой переменной).
Поэтому попытка записать по хранимому адресу значение может вызвать ошибку (если эта память уже кем-то занята), а может не вызвать (если ячейка еще свободна). Но даже если ошибки не будет, нужно помнить, что эта память считается свободной и может быть занята любой другой переменной, это означает, что вы можете потерять свое значение.
|
|
Для того чтобы указанная операция была выполнена корректна, необходимо выполнить дополнительную операцию:
pV = new int;
*pV = 10;
Оператор new выделит память, необходимую для размещения значения типа int, и вернет адрес этой ячейки памяти.
Важно помнить, что память под переменные, выделенные оператором new, не освобождается автоматически. Если программист только выделяет память и не освобождает ее после завершения использования, то имеет место «утечка памяти», она опасна в случае долго работающих программ или программ, работающих с большими объемами данных. Поэтому память, выделенная при помощи new, должна быть освобождена при помощи delete:
delete pV;
1. 8. Основные выводы:
int x; //объявление переменной целого типа
int* p; //объявление указателя на переменную целого типа
p = &x; //присвоить p адрес переменной x
x = *p; //присвоить x значение, которое находится по адресу, сохраненному в p